Quick Start 
In this article, you will learn how to create an UltiTools module and how to use UltiTools-API in your own plugin.
Create a new Spigot project 
Everything starts with an empty project, so you need to create an empty Spigot project. You can use IDEA's Minecraft plugin to quickly create an empty Spigot project, or manually create an empty maven project.
Add UltiTools-API to your project 
Whether you are creating an UltiTools module or using UltiTools-API, you need to add UltiTools-API to your dependencies in your Java project.
<dependency>
  <groupId>com.ultikits</groupId>
  <artifactId>UltiTools-API</artifactId>
  <version>{VERSION}</version>
</dependency>dependencies {
  implementation 'com.ultikits:UltiTools-API:{VERSION}'
}The newest version of UltiTools-API can be found in Maven Central.
Reload your project after adding the dependency.
Create a new UltiTools module 
The following content will teach you how to create an UltiTools module.
If you just want to use UltiTools-API in your own plugin, you can jump to Use UltiTools-API.
Create a module metadata file 
Before you start writing code, you need to create a plugin.yml file in the resources folder.
UltiTools will read this file before loading the module to confirm the main class of the module.
# Module name
name: TestPlugin
# Module version
version: '${project.version}'
# Module main class
main: com.test.plugin.MyPlugin
# UltiTools API version, for example 6.0.0 is 600
api-version: 600
# Module authors
authors: 
  - yournameCreate the main class of the module 
Create a new class that extends UltiToolsPlugin, similar to traditional Spigot plugins, UltiTools modules also need to override the startup and shutdown methods. But UltiToolsPlugin adds an optional UltiToolsPlugin#reloadSelf() method for execution when the module is reloaded.
// 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
    }
}Then you have completed an UltiTools module that does nothing.
Utilize UltiTools-API in your plugin 
TIP
If you are writing an UltiTools module that relies entirely on UltiTools to run, please skip this section and refer to the previous section!
Create a connector class 
Create a new class that extends UltiToolsPlugin, this class will be the connector class of your plugin.
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.EnableAutoRegister;
import java.io.IOException;
import java.util.List;
// This annotation is required for automatic registration
@EnableAutoRegister(scanPackage = "com.ultikits.plugin.ultikitsapiexample")
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 name, String version, List<String> authors, List<String> depend, int loadPriority, String mainClass) {
      super(name, version, authors, depend, loadPriority, 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
    }
}Register your connector class 
Since your plugin is not loaded by UltiTools, you need to manually register your connector class to the UltiTools plugin manager.
import com.ultikits.ultitools.UltiTools;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Collections;
// Your plugin main class
public final class UltiKitsExample extends JavaPlugin {
    @Override
    public void onEnable() {
        // Register this connector class to the UltiTools plugin manager
        UltiTools.getInstance().getPluginManager().register(
                UltiToolsConnector.class,
                "Example",  // Name
                "1.0.0",  // Version
                Collections.singletonList("wisdomme"),  // Authors
                Collections.emptyList(),  // Load after
                600,  // UltiTools API minimum version
                "com.ultikits.plugin.ultikitsapiexample.UltiToolsConnector"  // Full class name of the connector class
        );
    }
    
    @Override
    public void onDisable() {
        // Remember to unregister the connector class from the UltiTools plugin manager when the plugin is unloaded
        UltiTools.getInstance().getPluginManager().unregister(UltiToolsConnector.getInstance());
    }
}Verify installation 
If it is a module, put the module in the plugins/UltiTools/plugins folder and restart the server.
If it is a plugin connected to UltiTools, put the plugin in the plugins folder and restart the server.
Use this command in the game by OP or in the command line to verify that you have successfully connected to UltiTools.
ul listIf everything goes well, you should see the name and version of your plugin in the output.
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           <--- This is our pluginIn the following articles, you will learn how to use commands, events, configuration files, data storage, development annotations, etc.