Skip to content

快速开始

在这篇文章中,将会教你如何创建一个 UltiTools 模块。以及如何在自己的插件中使用UltiTools-API。

创建 Paper 项目

万事万物都起源于一个空项目,所以你需要创建一个空的Paper项目。你可以使用IDEA的Minecraft插件 来快速创建一个空的Paper项目,或者手动创建一个空的maven项目。

添加依赖项

不管是创建一个UltiTools模块还是使用 UltiTools-API,你都需要在你的 Java 项目中,将 UltiTools-API 添加到你的依赖项中。

xml
<dependency>
  <groupId>com.ultikits</groupId>
  <artifactId>UltiTools-API</artifactId>
  <version>6.2.5</version>
  <scope>provided</scope>
</dependency>
groovy
dependencies {
  compileOnly 'com.ultikits:UltiTools-API:6.2.5'
}

最新的UltiTools-API版本号,可以在 Maven Central 中查看。

添加完成后重载你的项目。

创建一个UltiTools的模块

以下内容将会教你如何创建一个UltiTools的模块。如果你只是想在自己的插件中使用UltiTools-API,可以跳转到 使用UltiTools-API

创建模块元数据文件

在你开始编写代码之前,你需要在 resources 文件夹中创建一个 plugin.yml 文件。

UltiTools 在加载该模块之前会先读取该文件,以便确认该模块的主类等信息。

yaml
# 模块名称
name: TestPlugin
# 模块版本
version: '${project.version}'
# 模块主类
main: com.test.plugin.MyPlugin
# 模块用到的UltiTools-API版本,例如6.2.0就是620
api-version: 620
# 模块作者
authors: [ yourname ]
# UltiTools 检查更新时使用的唯一标识符
identify-string: test-plugin

编写模块主类

新建一个主类继承 UltiToolsPlugin ,类似传统的Paper插件,UltiTools模块也需要重写启动和关闭方法。 UltiToolsPlugin 还定义了两个生命周期钩子方法,onReload()onUnregister(),分别用于重载与卸载时的工作。

自 v6.3.0 起

reloadSelf()unregisterSelf()final 方法,改为重写 onReload()onUnregister()

onUnregister() 在框架注销该模块的命令与监听器之前运行,此时模块自身的 bean 仍然存活。onReload() 在框架自身的重载步骤之后运行:配置重载、语言目录刷新,以及下文所述的重载日志行。

执行 /ul reload 时,框架会在调用 onReload() 之前记录一行日志,写明模块名称。如果模块原有的重写只是记录自己的重载日志,这个重写可以直接删除。如果模块有实际的重载或卸载工作,把原有的 reloadSelf()/unregisterSelf() 重写改名为 onReload()/onUnregister(),方法体不变。

java
package com.ultikits.docs.quickstart;

import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.abstracts.data.AuditableDataEntity;
import com.ultikits.ultitools.abstracts.data.BaseDataEntity;
import com.ultikits.ultitools.annotations.*;
import com.ultikits.ultitools.interfaces.DataOperator;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.bukkit.entity.Player;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

// This annotation contains automatic registration and must be added to the module main class
@UltiToolsModule
public class MyPlugin extends UltiToolsPlugin {
    @Override
    public boolean registerSelf() {
      // Executed when the module is started
      // If false is returned, UltiTools will not load this module
      return true;
    }
    
    @Override
    public void unregisterSelf() {
      // Optional, 
      // if you only need to unregister all commands and listeners, 
      // you don't need to override this method
      // Executed when the module is unregistered
    }
    
    @Override
    public void reloadSelf() {
      // Optional,
      // if you only need to reload the module configuration file,
      // you don't need to override this method
      // Executed when the module is reloaded
    }
}

这样就已经完成了一个什么功能都没有的UltiTools模块。

使用UltiTools-API

自 v6.2.2 起

你可以使用更简单的外部插件 API:在你的插件 onEnable() 中调用 UltiToolsAPI.connect(this) 即可。详情请参阅外部插件 API 指南

以下部分介绍的是旧版连接器方式,该方式仍然受支持,但不再推荐用于新项目。它的六参数构造器已标记为待移除,优先使用在你自己的 JavaPlugin 里调用的外部插件 API,或接收 resourceFolderPath 的七参数重载;替代签名仍在 issue #217 中讨论,移除动作跟踪于 issue #213

创建入口类(旧版)

新建一个类继承 UltiToolsPlugin ,这个类将会作为你的插件的入口类。

java
package com.ultikits.docs.quickstart;

import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.abstracts.data.AuditableDataEntity;
import com.ultikits.ultitools.abstracts.data.BaseDataEntity;
import com.ultikits.ultitools.annotations.*;
import com.ultikits.ultitools.interfaces.DataOperator;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.bukkit.entity.Player;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

// This annotation is required for automatic registration
@EnableAutoRegister(scanPackage = "com.ultikits.docs.quickstart")
public class UltiToolsConnector extends UltiToolsPlugin {

    // If you need to connect to UltiTools-API, you need to override this constructor with parameters,
    // the other one without parameters is for module development.
    // Please do not use the constructor without parameters here
    public UltiToolsConnector(String pluginName, String version, List<String> authors, List<String> loadAfter, int minUltiToolsVersion, String mainClass) {
      super(pluginName, version, authors, loadAfter, minUltiToolsVersion, mainClass);
    }
    @Override
    public boolean registerSelf() {
        // Executed when the module is started
        // If false is returned, UltiTools will not load this module
        return true;
    }

    @Override
    public void unregisterSelf() {
        // Optional,
        // if you only need to unregister all commands and listeners,
        // you don't need to override this method
        // Executed when the module is unregistered
    }

    @Override
    public void reloadSelf() {
        // Optional,
        // if you only need to reload the module configuration file,
        // you don't need to override this method
        // Executed when the module is reloaded
    }
}

这个类只有在你把模块打成 JAR、交由 UltiTools 走标准模块加载路径时才会起作用,见上文创建一个 UltiTools 的模块

将入口类注册到UltiTools插件管理器(旧版)

不由 UltiTools 加载的插件,过去要手动把入口类注册到 UltiTools 插件管理器。

六参数手动注册在 v6.2.5 上必定失败

下面曾经展示的 register(pluginClass, name, version, authors, loadAfter, minUltiToolsVersion, mainClass) 调用在 v6.2.5 上必定抛出异常:validateConstructorArgs 按类名前缀校验每个实参类型,Collections.singletonList(...)Collections.emptyList() 产出的 Collections$SingletonList/Collections$EmptyList 都不匹配任何白名单前缀,触发的 SecurityException 被外层 catch (Exception | Error) 吞掉,只打日志并返回 false。 改用本页前文「创建一个UltiTools的模块」那一节的写法,而不是这个入口类:那一节的主类没有声明任何构造器,UltiTools 从 plugins/UltiTools/plugins 通过自动生成的无参构造器加载它,完全不会走到 validateConstructorArgs,也不会碰到手工构造 ArrayList 之后仍会命中的 intInteger 精确匹配失败。 register(...) 是否应该接受这些实参类型,与连接器的替代签名一起在 issue #217 中讨论,六参数构造器本身已列入 issue #213 的移除清单。

验证安装

如果是模块,将模块放入插件文件夹/UltiTools/plugins文件夹中,重新启动服务器。

如果是连接到UltiTools的插件,将插件放入插件文件夹,重新启动服务器。

在游戏中OP或者在命令行中使用这个命令来验证你是否成功连接到了UltiTools。

shell
ul list

如果一切正常的话,你应该会在输出中看到你的插件的名字和版本。

text
ul list
[12:42:16] [Server thread/INFO]: BasicFunctions 1.0.0
[12:42:16] [Server thread/INFO]: UltiTools-Login 1.0.0
[12:42:16] [Server thread/INFO]: UltiTools-MysqlConnector 1.0.0
[12:42:16] [Server thread/INFO]: UltiTools-SidebarPlugin 1.0.0
[12:42:16] [Server thread/INFO]: Example 1.0.0           <--- 这是我们的示例插件

在后续的文章中,将会教你有关命令、事件、配置文件、数据存储、开发注解等的使用方法。

贡献者

The avatar of contributor named as Ling Bao Ling Bao
The avatar of contributor named as Claude Fable 5.1 Claude Fable 5.1