Bukkit服务端插件开发(一)

前言:

博客停了很久没更,主要也是上一个学期一直摸鱼,没啥写的

然后开发的项目也一直放着,完成度比较高的就是课设和机器人的API,没什么好写的

之前打算用在MC建筑中使用的插件也是鸽了很久没动,因为那个东西除了我需要一个填充功能之外想不出其他的功能了

然后这个假期除了开发BilibiliVote之外还会改一下机器人API的前后端代码

而这一系列的博文仅仅在开发DanmakuVote过程中的一些记录,后续或许会系统的把Bukkit相关的东西整理一下

本项目仓库地址:DanmakuVote

DanmakuVote基本构想

这个插件其实也是测试了一下土豆的HyperScape,然后看到有一个插件可以获取bilibili直播间弹幕发送到游戏中

土豆的这个游戏里面有一个观众互动性比较高的功能,每局游戏可以让观众投票一个事件,然后票高的事件接下来会在游戏中发生

那么结合bilibili直播间信息获取的一个接口,是不是可以考虑将这个功能在Minecraft中进行实现

那么基本的一个思路就是这样:

  • 插件只有服务端,仅仅考虑直播间播主为腐竹(OP)的情况,当然后续开发中还可以进行扩展
  • OP指定一个世界,用于插件的运行,相关的一些事件都发生在这个世界
  • 某些事件不需要指定世界,随机选取玩家进行事件的发生
  • 在直播间直播的情况下,间隔一段时间发起一个投票,在每个玩家的界面显示投票信息,同时服务端开始监听直播间弹幕信息
  • 观众可以在弹幕发送相关的指令,服务端插件开始收取并且统计指令,同时进行过滤

而在游戏中发生的事件,可以分为环境事件和个人事件两种,这里先考虑全部编入程序中作为插件的一部分,在后续的开发过程中可以分离,作为插件的配置信息进行读取,或是直接由OP添加设置

基本环境的搭建

这里就偷一下懒,工程的搭建比较轻松,在配置了Java环境之后,IDEA中有一个Minecraft的插件,安装后可以自动新建一个Bukkit工程,而不用自己开始配置。

Bukkit中的命令调用配置

指令添加

插件中涉及到命令的调用,在编写插件的相关函数之前,需要在plugin.yml文件中进行命令的注册,其形式如下:

1
2
3
4
5
6
commands:
setid:
description: Set bilibili live id // 命令描述
usage: /setid [live id] // 命令用法描述
permission: op // 权限节点
permission-message: You don not have <permission> // 用户没有权限时提示信息

注意:yml文件使用两个空格作为制表符,这里为了方便使用了tab键,在实现代码中使用tab会导致错误

重写onCommand函数

onCommand函数方法主体如下:

1
public boolean onCommand(CommandSender sender, Command command, String label, String[] args);

参数说明:

sender:命令的发送者

command:命令的对象

label:命令发送者所发送的命令

args:命令后面所跟的参数

在这个项目中,为了便于项目的维护,将每个命令分配到不同的类中进行实现,可以通过继承CommandExecutor进行实现

onEnable中可以进行命令的注册,使用继承CommandExecutor实现命令重写的时候,可以使用下面的方式进行命令注册

1
Bukkit.getPluginCommand("setid").setExecutor(new VoteIdSetExecutor(this));

而继承CommandExecutor的类可以通过下面的方式对onCommand函数进行实现

1
2
3
4
5
6
7
8
9
10
11
12
public class VoteIdSetExecutor implements CommandExecutor {
private final DanmakuVote plugin;

public VoteIdSetExecutor(DanmakuVote plugin) {
this.plugin = plugin;
}

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
// do something
}
}

直播间弹幕获取

直播间的弹幕监听可以使用socket连接bilibili的服务器进行监听

详细见RaiixDMServer

协议的说明后续有时间的情况下会进行编写,具体的实现也不是特别麻烦

配置文件读写

配置文件项

在src目录下创建config.yml文件,写入相关配置,作为在插件内的默认配置

1
2
3
4
5
Bilibili:
room_id: RoomId

Setting:
world_name:

在插件被启用的时候,其生命周期中有一个onEnable函数会被调用,在这个函数中可以读取配置文件

事件定义

投票事件可以分为世界事件以及玩家事件

世界事件

天气更改:修改指定世界的天气

玩家事件

怪物生成:随机选取玩家在其周围生成某种怪物

玩家传送:随机选取玩家传送到附近某个坐标位置

20200707 - 20200709

  • 完成对指定直播间弹幕的监听
  • 实现在插件事件开始投票时在用户侧边显示并且在聊天框进行显示
  • 投票机制的细化以及完善