Gearing
本帖最后由 Gearing 于 2019-1-21 17:22 编辑

写在前面:为什么我们要进行Sponge插件开发?
        Sponge本身实际上我们也可以理解为一种高版本的Forge Mod,他为插件开发者提供了各式各样对服务端的API的整合。我们可能以前熟悉Spigot、MCPC+、Kcauldron等等服务端,在使用过Sponge服务端过后,我们不难发现,他的核心是以mod形式安装在forge服务端上的。Sponge以这种形式弱化了服务器插件与MOD的区别。那么,我们为什么要学习Sponge插件开发?我们知道,高版本服务端提供商现在可选择的已经不多了,而高版本的MOD插件服务端就我已知的来说,就Sponge做的比较好,而高版本带来的好处就是有更好的优化,去除了那些低版本的游戏BUG,并且添加了新的游戏特性,这也是为什么我们要进行Sponge插件开发,除此之外,完成一个Sponge插件的开发实际上是非常简单的。


2021.12 数据,可能有更多内容
写在前面:为什么我们要进行Sponge插件开发?
  Sponge本身实际上我们也可以理解为一种高版本的Forge Mod,他为插件开发者提供了各式各样对服务端的API的整合。我们可能以前熟悉Spigot、MCPC+、Kcauldron等等服务端,在使用过Sponge服务端过后,我们不难发现,他的核心是以mod形式安装在forge服务端上的。Sponge以这种形式弱化了服务器插件与MOD的区别。那么,我们为什么要学习Sponge插件开发?我们知道,高版本服务端提供商现在可选择的已经不多了,而高版本的MOD插件服务端就我已知的来说,就Sponge做的比较好,而高版本带来的好处就是有更好的优化,去除了那些低版本的游戏BUG,并且添加了新的游戏特性,这也是为什么我们要进行Sponge插件开发,除此之外,完成一个Sponge插件的开发实际上是非常简单的。



1、安装JKD、Intellij Idea

对于JDK的安装:
  相信能阅读这篇文章的玩家们已经有了很多的经验,这里就不再赘述,如果您还不会JDK安装以及环境变量配置,请百度 JDK安装 以及 JDK环境变量配置。


对于Intellij idea安装:
   
IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版本还支持HTML,CSS,PHP,MySQL,Python等。免费版只支持Java等少数语言。(摘自百度百科)

我们为什么不选择Eclipse而选择了Idea?事实上idea在用户体验上做得比Eclipse好很多,设计理念也比Eclipse领先很多,大部分公司使用Eclipse而非idea的原因是因为高昂的使用版权费用,实际上,在私人开发中,我们更加倾向于使用Idea而非Eclipse。下面提供idea的下载地址:
http://www.jetbrains.com/idea/
idea是提供学生版本的,你可以在这里申请: https://www.jetbrains.com/student/ 他要求使用教育邮箱进行验证,一旦验证成功后,你将会获得IDEA付费版的一年使用期限,在过期后,你也可以继续使用该教育邮箱进行续期。当然,在中国国内,我们有其他办法继续使用它的正版。访问这里获得正版解决方案:http://idea.lanyus.com/ 但个人来说,我建议有经济能力的玩家们可以购买他们的正版以示支持,实际上idea的正版也是非常便宜的。


在拿到Idea正版后,我们开始正式进行工程。



2、Sponge开发环境搭建

   一般来说,我们喜欢用Gradle或者Maven进行项目管理(您可以点击链接获取更多有关Gradle和Maven的信息),他们能够极大的减小我们管理项目的难度,考虑到此次教程的简洁性,我们使用Maven进行项目管理。如果您不会Maven,请前往慕课网等等平台进行一个基础的入门学习,他们有非常多的免费课程。
  • 创建Idea Maven工程
    在进入idea的welcome界面后,我们点击<+ Create New Project> 来创建一个新的工程,在打开创建工程界面后,我们选择MAVEN。
像是这样:   

    随后,idea会提示我们输入有关项目的相信信息
   

    第一行的数据是填写“组名”,我们通常把我们的包名填写进去,下面是插件名,我们通常把我们这个项目的名字填写进去。第三行是版本,我们不改变。所以,我给出一个示例填写:
   

    点击<Next>,idea会提示你选择存放项目的位置,上面的是指项目的文件夹名称,下面的那一行是存放目录,这里就不再赘述。在按照你的习惯填写完成后,我们点击Finish。随后Idea会进行项目自动构建,我们在等待idea完成构建后再进行操作。
  • 查阅Sponge开发文档
既然是给Sponge开发插件,那么我们就必须按照Sponge 的要求来做,我们打开Sponge官网(没有被墙,可以直接访问):
https://www.spongepowered.org/
鼠标悬停在Sponge Logo上,点击<Docs>,你就开始你的正式开发了,我们开始按照Sponge的官方文档来进行开发。
我们看到这里:
https://docs.spongepowered.org/stable/zh-CN/plugin/project/maven.html
Sponge给出了Maven项目的配置方法:


设置 Maven
现在我们开始更改项目目录下的 pom.xml 文件,你可以直接在你的 pom.xml 的 <project> 中加入下面的内容以添加 SpongeAPI 的依赖:

代码:

  1. <repositories>
  2.     <repository>
  3.   <id>sponge-repo</id>
  4.   <name>Sponge Maven Repository</name>
  5.   <url>https://repo.spongepowered.org/maven</url>
  6.     </repository>
  7. </repositories>

  8. <dependencies>
  9.     <dependency>
  10.   <groupId>org.spongepowered</groupId>
  11.   <artifactId>spongeapi</artifactId>
  12.   <version>7.1.0</version>
  13.   <type>jar</type>
  14.   <scope>provided</scope>
  15.     </dependency>
  16. </dependencies>

这是Sponge官方给的代码参照(完整):   

代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>

  6.     <!-- Don't forget to change all necessary values to your own! -->
  7.     <groupId>com.example</groupId>
  8.     <artifactId>exampleid</artifactId>

  9.     <name>ExamplePluginName</name>
  10.     <version>1.0.0</version>

  11.     <url>http://example.com/</url>
  12.     <properties>
  13.   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14.     </properties>
  15.     <packaging>jar</packaging>

  16.     <repositories>
  17.   <repository>
  18.    <id>sponge-repo</id>
  19.    <url>https://repo.spongepowered.org/maven</url>
  20.   </repository>
  21.     </repositories>

  22.     <dependencies>
  23.   <dependency>
  24.    <groupId>org.spongepowered</groupId>
  25.    <artifactId>spongeapi</artifactId>
  26.    <version>7.1.0</version>
  27.    <type>jar</type>
  28.    <optional>true</optional>
  29.    <scope>provided</scope>
  30.   </dependency>
  31.     </dependencies>

  32.     <build>
  33.   <finalName>ExamplePluginName</finalName>
  34.   <defaultGoal>clean install</defaultGoal>
  35.   <resources>
  36.    <resource>
  37.     <targetPath>.</targetPath>
  38.     <directory>${basedir}/</directory>
  39.    </resource>
  40.   </resources>
  41.   <plugins>
  42.    <plugin>
  43.     <groupId>org.apache.maven.plugins</groupId>
  44.     <artifactId>maven-clean-plugin</artifactId>
  45.     <version>3.1.0</version>
  46.    </plugin>
  47.    <plugin>
  48.     <groupId>org.apache.maven.plugins</groupId>
  49.     <artifactId>maven-jar-plugin</artifactId>
  50.     <version>3.0.2</version>
  51.    </plugin>
  52.    <plugin>
  53.     <groupId>org.apache.maven.plugins</groupId>
  54.     <artifactId>maven-compiler-plugin</artifactId>
  55.     <version>3.7.0</version>
  56.     <configuration>
  57.   <source>1.8</source>
  58.   <target>1.8</target>
  59.     </configuration>
  60.    </plugin>
  61.   </plugins>
  62.     </build>
  63. </project>
这是我按照要求更改完成过后,pom.xml文件应该像是这样:

代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>

  6.     <groupId>info.niocho.www</groupId>
  7.     <artifactId>helloworld</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <repositories>
  10.   <repository>
  11.    <id>sponge-repo</id>
  12.    <name>Sponge Maven Repository</name>
  13.    <url>https://repo.spongepowered.org/maven</url>
  14.   </repository>
  15.     </repositories>

  16.     <dependencies>
  17.   <dependency>
  18.    <groupId>org.spongepowered</groupId>
  19.    <artifactId>spongeapi</artifactId>
  20.    <version>7.1.0</version>
  21.    <type>jar</type>
  22.    <scope>provided</scope>
  23.   </dependency>
  24.     </dependencies>

  25.     <build>
  26.   <finalName>ExamplePluginName</finalName>
  27.   <defaultGoal>clean install</defaultGoal>
  28.   <resources>
  29.    <resource>
  30.     <targetPath>.</targetPath>
  31.     <directory>${basedir}/</directory>
  32.    </resource>
  33.   </resources>
  34.   <plugins>
  35.    <plugin>
  36.     <groupId>org.apache.maven.plugins</groupId>
  37.     <artifactId>maven-clean-plugin</artifactId>
  38.     <version>3.1.0</version>
  39.    </plugin>
  40.    <plugin>
  41.     <groupId>org.apache.maven.plugins</groupId>
  42.     <artifactId>maven-jar-plugin</artifactId>
  43.     <version>3.0.2</version>
  44.    </plugin>
  45.    <plugin>
  46.     <groupId>org.apache.maven.plugins</groupId>
  47.     <artifactId>maven-compiler-plugin</artifactId>
  48.     <version>3.7.0</version>
  49.     <configuration>
  50.   <source>1.8</source>
  51.   <target>1.8</target>
  52.     </configuration>
  53.    </plugin>
  54.   </plugins>
  55.     </build>
  56. </project>

    此时,右下角idea会弹出小窗问你是否要加载改变,我们点击自动应用改变(右边的选项),等待Idea对项目进行构建。
至此,你已经完成了Sponge开发所需要的全部准备,让我开始正式编写Hello,world!插件。



3、我的第一个Sponge插件

我们在/src/main/java文件夹中新建Main.java
随后查看开发文档:https://docs.spongepowered.org/stable/zh-CN/plugin/plugin-class.html
我们按照开发文档进行编写:   

代码:

  1. package io.github.username.project;

  2. import org.spongepowered.api.plugin.Plugin;

  3. @Plugin(id = "exampleplugin", name = "Example Plugin", version = "1.0", description = "Example")
  4. public class ExamplePlugin {

  5. }

我编写完后是这样:


代码:

  1. import org.spongepowered.api.plugin.Plugin;

  2. @Plugin(id = "helloworld", name="A Hello World Plugin", version="1.0",description = "A Simple Plugin To Say Hello World!")
  3. public class Main {

  4. }
有的人可能会问了,为什么Sponge插件没有plugin.xml这类东西,实际上,Sponge引入了Annotation机制,@Plugin... 一行告诉了编译器以及解释器,这一行是插件入口,请从这一行开始加载。随后,我们添加一个监听器:   

代码:

  1. import org.spongepowered.api.plugin.Plugin;
  2. import org.spongepowered.api.event.Listener;
  3. import org.spongepowered.api.event.game.state.GameStartedServerEvent;

  4. // Imports for logger
  5. import com.google.inject.Inject;
  6. import org.slf4j.Logger;

  7. @Plugin(id = "exampleplugin", name = "Example Plugin", version = "1.0", description = "Example")
  8. public class ExamplePlugin {

  9.     @Inject
  10.     private Logger logger;

  11.     @Listener
  12.     public void onServerStart(GameStartedServerEvent event) {
  13.   logger.info("Successfully running ExamplePlugin!!!");
  14.     }

  15. }
按照官方代码示例完成后,我的代码像是这样:
 

代码:

  1. import com.google.inject.Inject;
  2. import org.slf4j.Logger;
  3. import org.spongepowered.api.event.Listener;
  4. import org.spongepowered.api.event.game.state.GameStartedServerEvent;
  5. import org.spongepowered.api.plugin.Plugin;

  6. @Plugin(id = "helloworld", name="A Hello World Plugin", version="1.0",description = "A Simple Plugin To Say Hello World!")
  7. public class Main {
  8.     @Inject
  9.     private Logger logger;

  10.     @Listener
  11.     public void onServerStart(GameStartedServerEvent event){
  12.   for(int mainLoop = 0;mainLoop < 5;mainLoop++){
  13.    logger.info("Hello, world!");
  14.   }
  15.     }
  16. }
   至于上面的@Inject 和 @Listener, @Inject属于一种依赖注入机制,后面我们会专门讲解,这里先这样写着就行了。@Listener属于一种由Sponge定义的监听器注解,我们后面也会讲到,现在先这样写着。随后我们开始编译项目:在idea右侧选择&lt;Maven Projects&gt;
   

  打开他,我们双击Lifecycle&gt;package:
 

  idea将会自动打包,等待idea打包完成。(这里我们先简单实用package 暂时不用更加复杂的打包插件)随后我们在Target/目录下可以找到生成的插件
 

  我们在文件资源管理器中将他拷贝到服务端mods文件夹中,然后运行Sponge服务端。
 

  可以看到控制台输出了Hello,world!,自此,你的第一个插件编写完成。


  更多教程会在今后发布,敬请期待。



Gearing
问题反馈请留言到:[email protected]

一些常用链接:海绵官网:https://www.spongepowered.org/
海绵文档:https://docs.spongepowered.org/
海绵源代码:https://github.com/SpongePowered
海绵插件库:https://forums.spongepowered.org/c/plugins/plugin-releases

GitHub:https://github.com/
GitWin: https://gitforwindows.org/

下载Maven:http://maven.apache.org/download.cgi
下载Idea:https://www.jetbrains.com/idea/
Idea注册码:http://idea.lanyus.com/


liach
如果条件允许,最好用 ./gradlew build 构建

Gearing
liach 发表于 2019-1-21 21:56
如果条件允许,最好用 ./gradlew build 构建

Gradle和Maven功能上区别并不大,只是Gradle的部分功能更加全面些,实际上gradle本身也是基于Maven开发的,没有必要一定要用Gradle,加上中国这边gradle构建的成功率低,我更加推荐使用Maven直接进行项目管理。

海螺螺
Gearing 发表于 2019-1-22 11:40
Gradle和Maven功能上区别并不大,只是Gradle的部分功能更加全面些,实际上gradle本身也是基于Maven开发的 ...

???
请对gradle的了解更多后再说,这两个区别大着
gradle比maven好的不是一点两点,官方对gradle也是更欢迎的,
并且使用gradle对后期你想写底层,写不基于spongeapi的东西,是有更好的一个过渡的,改改脚本就行。

教程可以

1850343382
支持,希望一直更新下去

Gearing
754503921 发表于 2019-1-22 12:17
???
请对gradle的了解更多后再说,这两个区别大着
gradle比maven好的不是一点两点,官方对gradle也是 ...

恩,谢谢支持

Gearing
1850343382 发表于 2019-1-22 13:30
支持,希望一直更新下去

恩,谢谢~

liach
gradle构建失败只是下载问题,maven同样无法避免。gradle也有离线模式避免下载。同时sponge提供一些官方gradle插件,比如spongegradle和event impl gen,帮助生成mcmod.info和方便实现事件。

Gearing
liach 发表于 2019-1-22 17:44
gradle构建失败只是下载问题,maven同样无法避免。gradle也有离线模式避免下载。同时sponge提供一些官方gra ...

恩,我去看了下,谢谢。

j1k26l
支持,希望一直更新下去

旧岛听风
支持支持

WQ【义战】
支持支持支持

寒江独钓
感谢楼主,希望一直更新下去qwq

NGK3
wow,教程很好哦~
(催更)