LuaInMinecraftBukkit II 是一个 Minecraft Bukkit 服务端插件, 目的是实现使用 Lua 脚本与Bukkit服务器交互.
Lua 是一个小巧的脚本语言, 拥有非常简单的语法, 还有着较为不错的运行速度. 试想一下, 用一个轻巧的, 不需要编译就可以运行的脚本编写Bukkit插件将多么美好. 如果要修改一个地方, 那就修改, 然后重新加载脚本就好了, 简直就像梦一样.
相比于上一代, 本代更注重于Lua原生虚拟机. 同样的, 本代也基于luajava项目. 不过与上一代相比, 本代使用克隆后的luajava仓库. 与原仓库相比, 克隆后的luajava仓库基本上重写了反射部分功能, 能够进一步简化Lua调用Java方法之间的过程, 并且在C语言端提供了非常友好的异常提示.
基本上就支持两大功能:
- 注册指令: 注册你想要的任何指令, 并且自动生成帮助信息和指令层级关系
- 监听事件: 监听任何你想要的Bukkit事件, 即使这个时间是其他插件的自定义事件
不过依托于Java的反射机制和动态代理机制, 目前可以实现在lua脚本中继承Java接口, 调用Java类型中的任何公开方法, 公开属性. 也就是说本插件可以动态的加载脚本, 享受Java的子集功能. 当然, 反射也不是万能的, 还是会出现很多Lua端无法处理的情况, 此时就需要使用Java为Lua架桥了. 不过在开发过程中我会尽量简化Lua与Java中的交互流程.
除开上述所说内容, 与第一代相同, 还能够加载C/C++所编写的动态链接库. 当然这都是 Lua 语言本身就支持的功能.
多亏了 cffi 的加持, JNIBridge 为此而生! 现在能够与动态链接库进行交互了. 目前 JNIBridge 还在完善中, 现支持功能有:
- Java 方法调用
- 基础类型转换
下一阶段计划支持的功能有:
- 字段访问与赋值
- 数组访问与赋值
下图是一个简单的玩家加入服务器事件, 不过事件处理逻辑由 Cpp 端处理.