Bukkit服务端插件开发(一)
前言:
博客停了很久没更,主要也是上一个学期一直摸鱼,没啥写的
然后开发的项目也一直放着,完成度比较高的就是课设和机器人的API,没什么好写的
之前打算用在MC建筑中使用的插件也是鸽了很久没动,因为那个东西除了我需要一个填充功能之外想不出其他的功能了
然后这个假期除了开发BilibiliVote之外还会改一下机器人API的前后端代码
而这一系列的博文仅仅在开发DanmakuVote过程中的一些记录,后续或许会系统的把Bukkit相关的东西整理一下
本项目仓库地址:DanmakuVote
DanmakuVote基本构想
这个插件其实也是测试了一下土豆的HyperScape,然后看到有一个插件可以获取bilibili直播间弹幕发送到游戏中
土豆的这个游戏里面有一个观众互动性比较高的功能,每局游戏可以让观众投票一个事件,然后票高的事件接下来会在游戏中发生
那么结合bilibili直播间信息获取的一个接口,是不是可以考虑将这个功能在Minecraft中进行实现
那么基本的一个思路就是这样:
- 插件只有服务端,仅仅考虑直播间播主为腐竹(OP)的情况,当然后续开发中还可以进行扩展
- OP指定一个世界,用于插件的运行,相关的一些事件都发生在这个世界
- 某些事件不需要指定世界,随机选取玩家进行事件的发生
- 在直播间直播的情况下,间隔一段时间发起一个投票,在每个玩家的界面显示投票信息,同时服务端开始监听直播间弹幕信息
- 观众可以在弹幕发送相关的指令,服务端插件开始收取并且统计指令,同时进行过滤
而在游戏中发生的事件,可以分为环境事件和个人事件两种,这里先考虑全部编入程序中作为插件的一部分,在后续的开发过程中可以分离,作为插件的配置信息进行读取,或是直接由OP添加设置
基本环境的搭建
这里就偷一下懒,工程的搭建比较轻松,在配置了Java环境之后,IDEA中有一个Minecraft的插件,安装后可以自动新建一个Bukkit工程,而不用自己开始配置。
Bukkit中的命令调用配置
指令添加
插件中涉及到命令的调用,在编写插件的相关函数之前,需要在plugin.yml
文件中进行命令的注册,其形式如下:
1 | commands: |
注意: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 | public class VoteIdSetExecutor implements CommandExecutor { |
直播间弹幕获取
直播间的弹幕监听可以使用socket连接bilibili的服务器进行监听
协议的说明后续有时间的情况下会进行编写,具体的实现也不是特别麻烦
配置文件读写
配置文件项
在src目录下创建config.yml
文件,写入相关配置,作为在插件内的默认配置
1 | Bilibili: |
在插件被启用的时候,其生命周期中有一个onEnable
函数会被调用,在这个函数中可以读取配置文件
事件定义
投票事件可以分为世界事件以及玩家事件
世界事件
天气更改:修改指定世界的天气
玩家事件
怪物生成:随机选取玩家在其周围生成某种怪物
玩家传送:随机选取玩家传送到附近某个坐标位置
20200707 - 20200709
- 完成对指定直播间弹幕的监听
- 实现在插件事件开始投票时在用户侧边显示并且在聊天框进行显示
- 投票机制的细化以及完善