
悲伤记录器回滚插件(GLRA)
DAQUEM 的 GriefLogger 插件,用于回滚命令 + 网页界面
查看大图Grieflogger 回滚插件
这个 NeoForge 插件从 SQLite(默认)或 MySQL/MariaDB 读取 GriefLogger 数据,并通过命令在游戏内还原方块操作。它面向 NeoForge 21.1.213 / Minecraft 1.21.1,且仅限服务端使用:任何已记录的方块放置或破坏都可以被选择性地撤销。它就像 CoreProtect,但适用于模组服务器。
功能
- 从 GriefLogger 数据库回滚方块更改和容器/物品栏更改(
blocks+containers表,并与materials、users、levels进行连接)。 - 按时间窗口、可选玩家名称以及围绕命令执行者的可选半径进行筛选。
- 在更改方块前确保目标区块已加载。
- 进度日志记录和每 tick 批处理,以保持服务器响应流畅。
- 所有命令和通知都有权限节点(支持 LuckPerms/权限模组,默认回退到 op 等级 3)。
- 对游戏内启动的回滚、通过 Web UI/API 触发的回滚以及被阻止/未授权的 Web 访问尝试进行广播通知。
- 如果启动时没有可用的数据库连接,则自动禁用自身。
- 可通过
griefloggerrollbackaddon-common.toml高度配置:数据库后端/凭据、Web UI/API 绑定/端口/令牌、回滚批大小、进度间隔以及未授权访问日志记录选项。
要求
- NeoForge 21.1.213 / Minecraft 1.21.1。
- 一个 GriefLogger 数据库(可以是 GriefLogger 写入的 SQLite 数据库文件,也可以是具有 GriefLogger 架构的 MySQL/MariaDB 数据库)。
- 具有读取权限的数据库凭据(用于 MySQL/MariaDB)。
- 首次服务器启动生成的配置文件
config/grieflogger/griefloggerrollbackaddon-common.toml(设置数据库类型/连接、Web 选项和批大小)。 - 如果启用了 Web UI/API:在绑定地址(
webApiBindAddress,默认0.0.0.0)上有一个空闲 TCP 端口(默认8765),并且如果暴露在 localhost 之外,还需要配置令牌(webApiToken)以及适当的防火墙/端口转发。 - 权限模组(例如 LuckPerms)可选;没有它时,只有管理员(op 等级 3)可以运行命令/接收通知。
安装
- 将模组 JAR 和你的后端 JDBC 驱动(SQLite、MySQL 或 MariaDB)放入服务器的
mods/文件夹。 - 启动服务器一次以生成
config/grieflogger/griefloggerrollbackaddon-common.toml。 - 通过
dbType选择后端(不区分大小写,默认SQLITE)。对于 SQLite,设置dbFile;对于 MySQL/MariaDB,设置主机/端口/名称/用户/密码。 - 检查日志中的
[griefloggerrollbackaddon] Database connection succeeded。如果失败,该插件将保持禁用,直到连接成功。
配置(config/grieflogger/griefloggerrollbackaddon-common.toml)
dbType(枚举,默认SQLITE):选择SQLITE、MYSQL或MARIADB(不区分大小写)。dbFile(字符串,默认config/grieflogger/grieflogger.sqlite):当dbType=SQLITE时的 SQLite 数据库文件路径。dbHost(字符串,默认localhost):MySQL/MariaDB 主机。dbPort(整数,默认3306):MySQL/MariaDB 端口。dbName(字符串,默认grieflogger):MySQL/MariaDB 的数据库名称。dbUser(字符串,默认root):MySQL/MariaDB 的数据库用户。dbPassword(字符串,默认空):MySQL/MariaDB 的数据库密码。rollbackBatchSize(整数,默认200):每 tick 处理的操作数量。progressTickInterval(整数,默认20):进度日志消息之间的 tick 间隔。webApiEnabled(布尔值,默认false):启动一个带有 Web UI 的小型 HTTP 服务器以触发回滚。requireApiToken(布尔值,默认false):如果为 true 且webApiToken为空,则禁用 Web UI/API;否则每个请求都必须包含令牌。webApiBindAddress(字符串,默认0.0.0.0):Web UI/API 的绑定地址。webApiPort(整数,默认8765):Web UI/API 的端口。webApiToken(字符串,默认空):Web 请求所需的可选共享密钥。仅在 localhost 上才可留空。logUnauthorizedWebAccess.enabled(布尔值,默认false):将未授权的 Web 请求记录到数据库表glra_web_unauthorized(保留最新 1000 条记录)。logUnauthorizedWebAccess.logHeaders(布尔值,默认false):存储未授权 Web 请求的请求头。logUnauthorizedWebAccess.logBody(布尔值,默认false):存储未授权 Web 请求的请求体(可能包含令牌)。logUnauthorizedWebAccess.logQuery(布尔值,默认true):存储未授权 Web 请求的查询字符串。
命令:/gl rollback
语法:/gl rollback t:<time> [u:<player>] [r:<radius|c<chunks>>] [i|b]
t:必需,要回滚的时间窗口。支持的单位:s、m、h、d、M(30 天)、y。示例:t:30m、t:12h、t:90s。u:可选,精确的玩家名称(匹配users表)。r:可选半径。默认使用方块(r:25)。前缀c切换到区块(r:c4= 4 个区块的半径)。前缀b强制使用方块(r:b40)。i可选标志:仅回滚物品栏/容器更改(物品)。b可选标志:仅回滚方块更改。如果既没有给出i也没有给出b,则两者都会回滚。
示例
/gl rollback t:2h- 回滚过去 2 小时内的所有操作。/gl rollback t:1d u:Griefer123- 仅回滚该玩家在过去 24 小时内的操作。/gl rollback t:30m r:c2- 回滚执行者周围 2 个区块内的操作。/gl rollback t:10m u:User r:20- 玩家筛选加 20 个方块的半径。/gl rollback t:45m i- 仅回滚过去 45 分钟内的物品栏/容器更改。/gl rollback t:10m b r:15- 仅回滚过去 10 分钟内 15 个方块范围内的方块更改。
其他命令
/gl web token add <player>— 为玩家创建/替换 Web API 令牌(可在聊天中复制)。/gl web token remove <player>— 删除玩家的 Web API 令牌。/gl web token list [page]— 列出令牌并带有复制到剪贴板的提示。/gl web start//gl web stop— 启动/停止内置 Web UI/API(遵循配置开关和令牌要求)。/gl config reload— 无需重启即可重新加载插件配置(griefloggerrollbackaddon-common.toml)。
Web UI / HTTP API
- 在配置中通过
webApiEnabled=true启用。默认为0.0.0.0:8765;根据需要更改webApiBindAddress/webApiPort。 - 可选安全性:设置
webApiToken并将其作为请求头X-Auth-Token或表单字段token传递。 - 打开
http://<bind>:<port>/可看到一个极简表单:时间窗口(例如30m)、可选玩家、方块/物品复选框、可选半径以及中心 X/Z/Y 和维度。该表单会 POST 到/api/rollback。 - API 端点
/api/rollback接受application/x-www-form-urlencoded,字段相同,并返回一个小型 JSON 状态。 - 未授权的请求可以记录到数据库(可配置),并将以可读消息通知符合条件的玩家/管理员。
权限
- 默认回退:如果没有权限模组,则为 op 等级 3。
- 节点(命名空间
griefloggerrollbackaddon):command.rollbackcommand.web.tokencommand.web.servercommand.config.reloadnotify.rollback(游戏内回滚命令)notify.web.rollback(Web 触发的回滚)notify.web.unauthorized(被阻止的 Web 请求) 使用你的权限模组(例如 LuckPerms)来授予/拒绝;否则只有管理员(等级 3)可以运行命令并接收通知。
工作原理
- 服务器启动:立即测试数据库连接。失败时,插件会禁用自身(无命令/事件)。
- 命令:
/gl rollback ...启动一个任务:- 在后台线程中从
blocks和containers加载自给定时间以来的匹配条目,可选地按玩家和/或半径筛选。
- 在后台线程中从
- 为每个坐标重建先前的方块状态(
oldMaterialName),以便正确反转放置和破坏。 - 将所有操作(方块 + 物品栏操作)加入队列进行处理,最新的优先,以便最新的更改先被撤销。
- 服务器 tick:每个 tick 最多处理
rollbackBatchSize个操作:BREAK日志从数据库条目恢复被破坏的方块。PLACE日志恢复先前的方块状态。- 容器日志移除已插入的物品,并加回已取走的物品(包括存储的 NBT)。如果容器已满,溢出物品会掉落在容器位置。
- 未知/其他代码回退到恢复先前状态(或空气)。
- 在设置方块之前加载目标区块。
- 进度:每
progressTickInterval个 tick,记录队列大小和已处理数量。当队列为空时,任务完成。
注意事项和限制
- 如果在恢复物品时容器没有空间,溢出物品会作为物品实体掉落在容器旁边。
- 维度映射使用
levels.name(ResourceLocation),或者回退到 ID 1/2/3(主世界/末地/下界)。 - 无效或未知的方块名称默认为
minecraft:air,并发出警告。 - JDBC 驱动未捆绑在模组 JAR 中;必须单独提供。
- 较大的时间窗口可能产生大量队列。调整
rollbackBatchSize和半径以控制服务器负载。
开发/构建
- Java 21,包含 Gradle wrapper。使用
./gradlew build在本地构建(Windows 上为gradlew.bat build)。 - MariaDB、MySQL 和 SQLite 驱动被声明为
localRuntime;生产环境中请单独提供驱动 JAR。
正在加载版本记录…

正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。