由于Spigot插件在不断更新,很多已有的中文文档已经不再适用,因此编写这篇文档对Spigot的官方教程做整理和翻译。
这份文档是为具备Java基础的开发者准备的,一些关于项目创建的过程直接略过了,只整理开发插件的核心内容。

新建项目

  1. 新建一个Java或Maven项目
  2. 导入spigot-api和bukkit的jar包
  • 这里可以在https://hub.spigotmc.org/nexus/#welcome中搜索spigot-api和bukkit,下载自己所开发版本对应的包,下载并拖到项目依赖中。
  • 如果不想手动下载,可建一个Maven项目,加入下面的repositories依赖,再把搜索结果右下方的信息复制到Maven的配置文件中,更新一下即可。
<repositories>
    <repository>
        <id>spigot-repo</id>
        <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
    </repository>
</repositories>

创建插件

  1. 新建插件的主类
  • 插件的主类需要继承JavaPlugin
  • JavaPlugin 提供了插件工作时所需要的各种方法和属性
  • 每个插件只能有一个主类,其它需要JavaPlugin的地方可以在onEnable()中将属性的引用传递过去。
  1. 重写onEnable()和onDisable()方法
  • 这两个方法会在服务器启动和关闭插件时执行
  1. 编写plugin.yml
  • 这个文件描述了插件的相关信息,其详细格式可参考下面代码

Main.java

package org.spigotmc.tutorial;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {
       @Override
       public void onEnable() {

       }

      @Override
      public void onDisable(){

      }
}

plugin.yml

name: //插件的名称
version: //插件的版本
author: //插件的作者
main: //插件的主类,记得带包名
depend: //插件的前置依赖
website: //作者网站,通过 /version <pluginname> 可以查看
commands: //插件的命令(没有可以不写)
      <command>:  //命令名称,不带'/'
               description: //命令描述,/help 时可以查看
               usage: //命令在控制台中的使用方式,带'/'

创建一个命令

  1. 新建命令类
  • 命令的主类需要引用CommandExecutor 接口
  1. 重写public boolean onCommand(CommandSender commandSender, Command command, String label, String[] args)方法
  • commandSender - 命令的发送者,可以是玩家、控制台或命令方块
  • command - 发送命令的一些信息,其实就是plugin中配置的一些信息,感觉这个参数没啥作用呀
  • label - 玩家敲的命令,会自动去掉'/',感觉这个参数也没啥用
  • args - 玩家敲的命令后面跟的参数
  1. 在主类中注册命令类this.getCommand("kit").setExecutor(new CommandKit());
  • getCommand中的值在plugin.yml中需要有对应,否则会返回null
  1. 在plugin.yml中添加这个命令即可
  2. 补充:如果指令发送者为玩家,就可以通过(Player) commandSender强制转换获得玩家对象
  • 记得先判断一下,防止代码出错if (sender instanceof Player)

CommandKit .java

public class CommandKit implements CommandExecutor {
    // This method is called, when somebody uses our command
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (sender instanceof Player) {
            Player player = (Player) sender;

            // Create a new ItemStack (type: diamond)
            ItemStack diamond = new ItemStack(Material.DIAMOND);

            // Create a new ItemStack (type: brick)
            ItemStack bricks = new ItemStack(Material.BRICK);

            // Set the amount of the ItemStack
            bricks.setAmount(20);

            // Give the player our items (comma-seperated list of all ItemStack)
            player.getInventory().addItem(bricks, diamond);
        }

        // If the player (or console) uses our command correct, we can return true
        return true;
    }
}

Main.java

@Override
public void onEnable() {
        // Register our command "kit" (set an instance of your command class as executor)
        this.getCommand("kit").setExecutor(new CommandKit());
    }

plugin.yml

# Replace "kit" with the name of your command.
commands:
  kit:
    description: Your description
    usage: /kit

创建一个事件监听

  1. 新建监听类
  • 监听类需要实现Listener接口
  1. 添加需要监听的方法
  • 方法名称为 public void on+事件名称(事件名称 event)
  • 事件名称可以在javadocorg.bukkit.event包下面查找
  • 比如有个玩家加入的事件PlayerJoinEvent,那么就写public void onPlayerJoin(PlayerJoinEvent event)
  • 记得加上@EventHandler注解
  • event的方法在javadoc里面也可以查得到
  1. 在主类中注册监听类getServer().getPluginManager().registerEvents(new MyListener(), this);

MyListener.java

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

public class MyListener implements Listener
{
     @EventHandler
     public void onPlayerJoin(PlayerJoinEvent event)
     {
         event.setJoinMessage("Welcome, " + event.getPlayer().getName() + "!");
     }
}

Main.java

@Override
public void onEnable()
{
    getServer().getPluginManager().registerEvents(new MyListener(), this);
}