马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 hahahahahah 于 2025-7-3 22:36 编辑
LuaInMinecraftBukkit II 在你的服务器中运行 Lua 吧!
与上一代 LuaInMinecraftBukkit 相比, 本代主要聚焦于Lua原生版本, 目的是为了提供一个更加易用的插件. 目前本插件支持系统包含MacOS, Linux, 以及Windows. 支持的Lua版本包含: Lua5.1(LuaJIT), Lua5.2, Lua5.3, Lua5.4.
目前插件还在开发中, 若遇到问题欢迎去github上提交issue.
交流群: 662312388 这个插件是什么?
=====
这个插件为"使用Lua与Bukkit进行交互"提供可能性. Lua 是一个小巧的脚本语言, 拥有
非常简单的语法, 还有着较为不错的运行速度. 试想一下, 用一个轻巧的, 不需要编译就
可以运行的脚本编写Bukkit插件将多么美好. 如果要修改一个地方, 那就修改, 然后重新
加载脚本就好了, 简直就像梦一样.
当然, 本插件所使用的Lua脚本解释器并非Luaj项目, 而是Lua的原生虚拟机. 多亏了
开普勒的luajava项目, 次插件才能问世. 不过与第一代 LuaInMinecraftBukkit 插件相
比, 所使用的luajava项目已经由我经过较为彻底的翻新, 与开普勒的原仓库相比, 我
为其完善了反射支持, 并且在C语言端提供了非常友好的异常提示.
目前能做什么?
=====
基本上就支持两大功能:
- 注册指令: 注册你想要的任何指令, 并且自动生成帮助信息和指令层级关系
- 监听事件: 监听任何你想要的Bukkit事件, 即使这个事件是其他插件的自定义事件
不过依托于Java的反射机制和动态代理机制, 目前可以实现在lua脚本中继承Java接口,
调用Java类型中的任何公开方法, 公开属性. 也就是说本插件可以动态的加载脚本,
享受Java的子集功能. 当然, 反射也不是万能的, 还是会出现很多Lua端无法处理的情况,
此时就需要使用Java为Lua架桥了. 不过在开发过程中我会尽量简化Lua与Java中的交互流程.
除开上述所说内容, 与第一代相同, 还能够加载C/C++所编写的动态链接库. 当然这都是Lua 语言本身就支持的功能, 对于不喜欢写 Java 的小伙伴门可以尝试一下使用 Lua + FFI 形式编写服务器交互脚本.
快速使用
=====
快速使用文档从 Lua 脚本语法开始, 到制作一个基于玩家聊天框的 Lua 脚本解释器.
一步一步让您快速上手, 并体验无需重启服务器, 但能重新加载修改后的 Lua 脚本的便利! 此外即将补充更多的文档信息.
怎么安装?
=====
仅需要将下载好的插件放入plugins文件夹就足够了, 目前支持 Native 动态链接库资源支持 Windows, Linux 以及 MacOS 系统, 并且每个系统都支持 LuaJIT, Lua52, Lua53, Lua54 四个版本. 插件在启动时会根据您的系统类别和系统架构自动下载预编译好的 Native 动态链接库资源.
插件指令
=====
插件目前还在开发中, 支持的指令并不是很多, 可以在加载完插件后在游戏中输入
"/LuaInMinecraftBukkitII help" 或者 "/lua help" 获取指令的帮助信息, 这些指令都
只能由OP或者具有LuaInMinecraftBukkitII.Admin权限的人使用.
配置文件
=====
配置文件为 config.json, 并且这个配置文件中支持以"//"开头的注释信息, 例如在
配置文件中, 你可以写 "// abc". 默认配置信息如下所示:
- {
- // 项目资源地址
- "projectUrl": "https://raw.githubusercontent.com/SmileYik/LuaInMinecraftBukkitII/refs/heads/gh-page",
- // 使用的lua版本
- "luaVersion": "lua-5.4.8",
- // 总是检查依赖库Hash是否正确
- "alwaysCheckHashes": false,
- // debug 标志
- "debug": true,
- "bStats": true,
- // lua 环境
- "luaState": {
- // lua 环境 id
- "default": {
- // 该环境运行在哪个目录下, "/" 代表插件目录下的luastate目录.
- "rootDir": "/",
- // 是否忽略访问限制, 忽略访问限制时可以强制访问java中的私有方法.
- "ignoreAccessLimit": false,
- // 初始化脚本列表, 下面填脚本名, 并且脚本文件得在rootDir中寻找的到.
- "initialization": [
- {
- "file": "test.lua",
- "autoReload": false,
- "depends": []
- }
- ]
- }
- }
- }
复制代码
示例Lua脚本
=====
以上示例配置信息中将会在插件启动时创建一个默认名为"default"的Lua
环境, 并且在创建完环境后会自动加载"/plugins/LuaInMinecraftBukkitII/luaState/test.lua"
脚本文件, 而示例的test.lua脚本文件内容如下:
- -- 文件路径: /plugins/LuaInMinecraftBukkitII/luastate/test.lua
- local monitorTask = nil
- -- 定义指令列表, 之后会使用这个列表去创建一个指令类型
- local commands = {
- {
- command = "hello",
- description = "Say Hello to you",
- args = {"msg"},
- handler = function (sender, args)
- sender:sendMessage("Hello, " .. args[1] .. "!")
- end
- },
- {
- command = "hi",
- description = "Say Hi to you",
- needPlayer = true,
- handler = function (sender, args)
- sender:sendMessage("Hello, " .. sender:getName() .. "!")
- end
- }
- }
- -- 构建一个指令类型
- local topCommandClass = luaBukkit.env:commandClassBuilder()
- :commands(commands)
- :command("say")
- :args({"msg"})
- :description("say something")
- :handler(function(sender, args)
- sender:sendMessage(args[1])
- end)
- :aliases({"tc", "testc"})
- :build("TestCommand")
- -- 注册刚刚构建的指令类型
- -- 注册完后你可以使用 "/TestCommand" 或者别名 "/tc", "/testc" 去执行你定义的指令.
- -- also you can use "/TestCommand help" to display command help information.
- local result = luaBukkit.env:registerCommand("TestCommand", {"tc", "testc"}, {topCommandClass})
- if result:isError() then luaBukkit.log:info("Register command failed!") end
- -- 定义事件监听器
- local listeners = {
- {
- event = "PlayerJoinEvent",
- handler = function(event) luaBukkit.log:info("event normal") end
- },
- {
- event = "org.bukkit.event.player.PlayerJoinEvent",
- priority = "HIGH",
- handler = function(event) luaBukkit.log:info("event high") end
- }
- }
- -- 构建事件监听器
- luaBukkit.env:listenerBuilder()
- :subscribes(listeners)
- :subscribe({
- event = "PlayerJoinEvent",
- priority = "LOW",
- handler = function(event)
- luaBukkit.log:info("event low")
- if monitorTask ~= nil then
- monitorTask:cancel()
- end
- end
- })
- :build()
- :register("MyListeners")
- -- 全局Lua方法变量, 可以使用指令调用 /lua call default test
- function test()
- luaBukkit.log:info("Test")
- end
- monitorTask = luaBukkit.helper:asyncTimer(
- function()
- luaBukkit.log:info("Still not player join sever...?")
- end, 0, 20, nil
- )
- luaBukkit.helper:runnable(function() luaBukkit.log:info("runnable") end):run()
复制代码
相关图片
=====
|