我的世界官网中文百科zh.minecraft.wikiJava版服务器列表基岩版服务器列表
帖子

Memorial Edition

查看: 65|回复: 0

[原创插件] LuaInMinecraftBukkit II —— Lua 引擎, 用 Lua 与 Bukkit 交互. 支持 LuaJIT, Lua54, FFI

[复制链接]

Lv.9 牧场主

人气
606 点
金粒
21734 粒
宝石
17 颗
爱心
3 颗
钻石
2358 颗
贡献
11 点

论坛元老勋章骨灰勋章Java正版勋章Windows 10正版勋章金锭勋章开发人员勋章石镐矿工勋章铁镐矿工勋章钻镐矿工勋章小麦种勋章苹果树勋章猪灵勋章

发表于 昨天 22:25 | 显示全部楼层 |阅读模式
Lua在桶里汪汪叫 LuaInMinecraftBukkit II
  • 概要
  • 下载链接
  • 授权信息

适用服务端:CraftBukkit Spigot Paper Bukkit 

插件类型: 前置API 

语言支持: 简体中文 English 

适用版本:

前置插件:

简介: 用 Lua 与你的服务器进行交互! 支持 LuaJIT, Lua54, FFI 及 dll/so/dylib 动态链接库

LOGO

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hahahahahah 于 2025-7-4 18:55 编辑

logo.webp
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". 默认配置信息如下所示:



  1. {
  2.   // 项目资源地址
  3.   "projectUrl": "https://raw.githubusercontent.com/SmileYik/LuaInMinecraftBukkitII/refs/heads/gh-page",
  4.   // 使用的lua版本
  5.   "luaVersion": "lua-5.4.8",
  6.   // 总是检查依赖库Hash是否正确
  7.   "alwaysCheckHashes": false,
  8.   // debug 标志
  9.   "debug": true,
  10.   "bStats": true,
  11.   // lua 环境
  12.   "luaState": {
  13.     // lua 环境 id
  14.     "default": {
  15.       // 该环境运行在哪个目录下, "/" 代表插件目录下的luastate目录.
  16.       "rootDir": "/",
  17.       // 是否忽略访问限制, 忽略访问限制时可以强制访问java中的私有方法.
  18.       "ignoreAccessLimit": false,
  19.       // 初始化脚本列表, 下面填脚本名, 并且脚本文件得在rootDir中寻找的到.
  20.       "initialization": [
  21.         {
  22.           "file": "test.lua",
  23.           "autoReload": false,
  24.           "depends": []
  25.         }
  26.       ]
  27.     }
  28.   }
  29. }

复制代码


示例Lua脚本
=====


以上示例配置信息中将会在插件启动时创建一个默认名为"default"的Lua
环境, 并且在创建完环境后会自动加载"/plugins/LuaInMinecraftBukkitII/luaState/test.lua"
脚本文件, 而示例的test.lua脚本文件内容如下:

  1. -- 文件路径: /plugins/LuaInMinecraftBukkitII/luastate/test.lua
  2. local monitorTask = nil

  3. -- 定义指令列表, 之后会使用这个列表去创建一个指令类型
  4. local commands = {
  5.     {
  6.         command = "hello",
  7.         description = "Say Hello to you",
  8.         args = {"msg"},
  9.         handler = function (sender, args)
  10.             sender:sendMessage("Hello, " .. args[1] .. "!")
  11.         end
  12.     },
  13.     {
  14.         command = "hi",
  15.         description = "Say Hi to you",
  16.         needPlayer = true,
  17.         handler = function (sender, args)
  18.             sender:sendMessage("Hello, " .. sender:getName() .. "!")
  19.         end
  20.     }
  21. }

  22. -- 构建一个指令类型
  23. local topCommandClass = luaBukkit.env:commandClassBuilder()
  24.     :commands(commands)
  25.     :command("say")
  26.         :args({"msg"})
  27.         :description("say something")
  28.         :handler(function(sender, args)
  29.             sender:sendMessage(args[1])
  30.         end)
  31.     :aliases({"tc", "testc"})
  32.     :build("TestCommand")



  33. -- 注册刚刚构建的指令类型
  34. -- 注册完后你可以使用 "/TestCommand" 或者别名 "/tc", "/testc" 去执行你定义的指令.
  35. -- also you can use "/TestCommand help" to display command help information.
  36. local result = luaBukkit.env:registerCommand("TestCommand", {"tc", "testc"}, {topCommandClass})
  37. if result:isError() then luaBukkit.log:info("Register command failed!") end

  38. -- 定义事件监听器
  39. local listeners = {
  40.     {
  41.         event = "PlayerJoinEvent",
  42.         handler = function(event) luaBukkit.log:info("event normal") end
  43.     },
  44.     {
  45.         event = "org.bukkit.event.player.PlayerJoinEvent",
  46.         priority = "HIGH",
  47.         handler = function(event) luaBukkit.log:info("event high") end
  48.     }
  49. }

  50. -- 构建事件监听器
  51. luaBukkit.env:listenerBuilder()
  52.     :subscribes(listeners)
  53.     :subscribe({
  54.         event = "PlayerJoinEvent",
  55.         priority = "LOW",
  56.         handler = function(event)
  57.             luaBukkit.log:info("event low")
  58.             if monitorTask ~= nil then
  59.                 monitorTask:cancel()
  60.             end
  61.         end
  62.     })
  63.     :build()
  64.     :register("MyListeners")

  65. -- 全局Lua方法变量, 可以使用指令调用 /lua call default test
  66. function test()
  67.     luaBukkit.log:info("Test")
  68. end

  69. monitorTask = luaBukkit.helper:asyncTimer(
  70.     function()
  71.         luaBukkit.log:info("Still not player join sever...?")
  72.     end, 0, 20, nil
  73. )

  74. luaBukkit.helper:runnable(function() luaBukkit.log:info("runnable") end):run()
复制代码


相关图片
=====









您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

勇气,就是即便害怕也会去做。

Archiver|小黑屋| MCBBS纪念版 ( 新ICP备2024014954号|兵公网安备66010002000149号 )|隐私政策| 手机版

GMT+8, 2025-7-4 21:24 , Processed in 0.141500 second(s), 21 queries , Redis On.

"Minecraft"以及"我的世界"为美国微软公司的商标 本站与微软公司没有从属关系

© 2010-2025 MCBBS纪念版 版权所有 本站内原创内容版权属于其原创作者,除作者或版规特别声明外未经许可不得转载

返回顶部