由于Spigot插件在不断更新,很多已有的中文文档已经不再适用,因此编写这篇文档对Spigot的官方教程做整理和翻译。
这份文档是为具备Java基础的开发者准备的,一些关于项目创建的过程直接略过了,只整理开发插件的核心内容。
新建项目
- 新建一个Java或Maven项目
- 导入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>
创建插件
- 新建插件的主类
- 插件的主类需要继承JavaPlugin
- JavaPlugin 提供了插件工作时所需要的各种方法和属性
- 每个插件只能有一个主类,其它需要JavaPlugin的地方可以在onEnable()中将属性的引用传递过去。
- 重写onEnable()和onDisable()方法
- 这两个方法会在服务器启动和关闭插件时执行
- 编写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: //命令在控制台中的使用方式,带'/'
创建一个命令
- 新建命令类
- 命令的主类需要引用CommandExecutor 接口
- 重写
public boolean onCommand(CommandSender commandSender, Command command, String label, String[] args)
方法
- commandSender - 命令的发送者,可以是玩家、控制台或命令方块
- command - 发送命令的一些信息,其实就是plugin中配置的一些信息,感觉这个参数没啥作用呀
- label - 玩家敲的命令,会自动去掉'/',感觉这个参数也没啥用
- args - 玩家敲的命令后面跟的参数
- 在主类中注册命令类
this.getCommand("kit").setExecutor(new CommandKit());
- getCommand中的值在plugin.yml中需要有对应,否则会返回null
- 在plugin.yml中添加这个命令即可
- 补充:如果指令发送者为玩家,就可以通过
(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
创建一个事件监听
- 新建监听类
- 监听类需要实现Listener接口
- 添加需要监听的方法
- 方法名称为
public void on+事件名称(事件名称 event)
- 事件名称可以在javadoc中
org.bukkit.event
包下面查找 - 比如有个玩家加入的事件PlayerJoinEvent,那么就写
public void onPlayerJoin(PlayerJoinEvent event)
- 记得加上@EventHandler注解
- event的方法在javadoc里面也可以查得到
- 在主类中注册监听类
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);
}