倒计时

倒计时

一个管理服务器关闭和重启的多功能工具

T-Minus

T-Minus 是一款轻量级、稳健且高度可定制的服务端实用工具,用于管理服务器重启与关闭。无论您是运行一个小型私人服务器,还是一个大型公共网络,T-Minus 都能确保您计划的维护和手动重启无缝进行,并让您的玩家全程了解最新动态。

与旧版重启工具不同,T-Minus 采用了经过优化的非阻塞式调度器,可以提前数小时广播低调的倒计时公告,而不会锁定服务器指令或引起提前卡顿。

主要特点

  • 灵活的调度引擎: 可在每天特定时间或指定日期(YYYY-MM-DD)安排关闭或重启。
  • 时区支持: 使用标准时区(如 UTC 偏移量 +3、-5 或 0)来定义您的计划任务,轻松与全球玩家协调。
  • 智能公告: 为小时、分钟和秒创建自定义公告间隔(例如,在 10 小时、2 小时、30 分钟、5 分钟时提醒玩家,然后在最后 10 秒每秒倒计时一次)。
  • 多种输出模式: 直接将倒计时广播到玩家聊天栏、操作栏(快捷栏上方)以提高可见性,或两者兼有。
  • 完全可定制的消息: 可修改每个前缀、警告、错误、踢出界面和原因。完全支持标准 Minecraft 颜色格式代码(§)。
  • 实时配置重载: 调整设置、修改即将进行的计划,或本地化消息文本,然后实时重载配置,无需重启服务器。
  • 操作员级别安全: 设置所需的操作员(OP)权限级别(从 1 到 4),以限制可以管理服务器循环的人员。

命令与用法

所有命令都需要操作员权限(通过配置文件中的 opLevel 设置)。

/tminus status - 显示模组的当前状态、所需操作员级别、广播输出模式,并列出即将进行的计划关闭和重启及其精确剩余时间。

/tminus status

/tminus reload - 实时重载配置文件(config/tminus.toml)。适用于快速更新计划或消息。

/tminus reload

/tminus stop <seconds> [reason] - 使用自定义倒计时启动手动关闭流程。如果未指定原因,则默认为配置中的备用关闭原因。

('/tminus stop 120 gn yall'): /tminus stop 120 gn yall

/tminus restart <seconds> [reason] - 使用自定义倒计时启动手动重启流程。如果未指定原因,则默认为配置中的备用重启原因。

('/tminus restart 460 im bored'): /tminus restart 460 im bored

/tminus cancel - 立即停止任何进行中的倒计时(手动或计划),并通知玩家该流程已取消。

/tminus cancel

/tminus cancel

配置文件(tminus.toml)

首次启动时,模组会生成一份整洁、注释详细的配置文件,位于 config/tminus.toml。以下是展示其灵活性的配置示例:

# T-Minus Mod 配置文件

启用或禁用整个模组

enabled = true

执行命令所需的操作员(OP)级别(1 至 4)

opLevel = 4

消息广播模式:

"CHAT" - 仅聊天栏

"ACTIONBAR" - 仅操作栏(快捷栏上方)

"BOTH" - 聊天栏和操作栏同时显示

outputMode = "BOTH"

所有聊天消息的前缀(支持 Minecraft 颜色代码,如 §)

textPrefix = "§r§f[服务器] §r"

关闭/重启通知的公告间隔

[announcements] seconds = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] minutes = [30, 15, 10, 5, 1] hours = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

分别启用/禁用计划的关闭和重启

shutdownScheduleEnabled = false restartScheduleEnabled = false

计划的关闭

date: 可以是 "everyday" 或 具体 "YYYY-MM-DD"

time: 格式为 "HH:MM"(24小时制)

timezone: UTC 偏移量(例如 "-5"、"0"、"+3")

repeatHours:(可选)从指定日期和时间开始,每隔 N 小时重复一次

[[shutdownSchedule]] date = "everyday" time = "04:00" timezone = "0"

计划的重启

[[restartSchedule]] date = "everyday" time = "16:00" timezone = "0"

系统消息和短语

[messages] shutdownInitiated = "§c服务器将在 §6%time%§c 后关闭,原因:§e%reason%§r" shutdownCancelled = "§a管理员已取消服务器关闭!§r" restartInitiated = "§e服务器将在 §6%time%§e 后重启,原因:§6%reason%§r" restartCancelled = "§a管理员已取消服务器重启!§r" countdownHours = "§c剩余时间:§6%time% 小时。§c 原因:§e%reason%§r" countdownMinutes = "§c剩余时间:§6%time% 分钟。§c 原因:§e%reason%§r" countdownSeconds = "§c剩余时间:§6%time% 秒!§c 原因:§e%reason%§r" shutdownKickMessage = "§c服务器正在进行维护关闭。\n§c原因:§6%reason%§r" restartKickMessage = "§e服务器正在重启。\n§e原因:§6%reason%§r" noActiveTask = "§7当前没有进行中的关闭或重启进程。§r" shutdownActive = "§6活动任务:§c关闭§r" restartActive = "§6活动任务:§e重启§r" waitingForTask = "§6活动任务:§7无(等待中)§r" timeRemaining = "§c剩余时间:§6%time% 秒。§r" currentReason = "§c原因:§e%reason%§r" prefixRequired = "§c只有级别达到 §e%level%§c 的操作员才能使用此命令!§r" configReloaded = "§aT-Minus 配置已成功重载!§r" alreadyRunning = "§c已有任务在运行!请先取消它。§r" shutdownInitiatedCommand = "§c已启动关闭,将在 §6%time% 秒后执行。§c 原因:§e%reason%§r" restartInitiatedCommand = "§e已启动重启,将在 §6%time% 秒后执行。§e 原因:§6%reason%§r" statusHeader = "§6--=={ §eT-Minus 状态§6 }==--§r" statusEnabled = "§6模组状态:§a已启用§r" statusDisabled = "§6模组状态:§c已禁用§r" statusOpLevel = "§6所需操作员级别:§e%level%§r" statusOutputMode = "§6输出模式:§e%mode%§r" statusCountdownTrigger = "§6公告:秒:§e%seconds%§6 | 分钟:§e%minutes%§6 | 小时:§e%hours%§r" statusShutdownScheduleEnabled = "§6计划关闭:§a已启用§r" statusShutdownScheduleDisabled = "§6计划关闭:§c已禁用§r" statusRestartScheduleEnabled = "§6计划重启:§a已启用§r" statusRestartScheduleDisabled = "§6计划重启:§c已禁用§r" upcomingShutdowns = "§6即将进行的计划关闭:§r" upcomingRestarts = "§6即将进行的计划重启:§r" noUpcomingTasks = "§7 没有即将进行的计划任务。§r" scheduledTaskFormat = "§6 - 日期:§e%date%§6,时间:§e%time%§6 (§eUTC%timezone%)§6 -> 将在 §e%remaining%§r 后触发§r" modDisabledError = "§7T-Minus 模组当前已在配置中§c禁用§7!§r" errorMissingSecondsStop = "§c错误:缺少必需参数 'seconds'!用法:§6/tminus stop <seconds> [reason]§r" errorMissingSecondsRestart = "§c错误:缺少必需参数 'seconds'!用法:§6/tminus restart <seconds> [reason]§r" errorInvalidNumber = "§c错误:'seconds' 的数字格式无效!必须是正整数,当前输入:§6'%input%'§r" errorNegativeNumber = "§c错误:'seconds' 必须是正整数(大于等于 1)!当前输入:§6'%input%'§r" repeatsEveryFormat = " §6(每 §e%hours%小时§6 重复一次)§r" scheduledRestartReason = "计划重启(%time% UTC%timezone%)§r" scheduledShutdownReason = "计划关闭(%time% UTC%timezone%)§r" defaultShutdownReason = "维护" defaultRestartReason = "重启"

工作原理

与传统的、在执行前数小时就生成繁重持续任务的关闭脚本不同,T-Minus 实现了双阶段调度逻辑:

  1. 被动公告阶段: 只要计划事件还很遥远,模组就会运行被动的小时/分钟检查。如果时间匹配到您预设的间隔之一(例如,剩余 2 小时),就会向玩家发送一条简洁的提醒,不影响主服务器循环。
  2. 主动倒计时阶段: 当剩余时间降至您配置的 [announcements] 时,模组会初始化实时视觉倒计时引擎,在操作栏上显示跳动的警告,并以清晰的断开连接踢出界面完成任务。