## 链接
[SpigotMC](https://www.spigotmc.org/resources/whitelistbytime-1-21-4.98946/) - 下载超过 5200 次 (2025年10月4日).\
[Modrinth](https://modrinth.com/plugin/whitelistbytime) - 下载 250 次 (2025年10月4日).\
[GitHub](https://github.com/NightMirror21/WhitelistByTime) - 9星 (2025年10月4日)。
## 简介
这是一个 Minecraft 服务器插件。它允许你为玩家添加时间或永久白名单。
**该插件已为 Paper 1.20.x-1.21.x 开发和测试。 它还支持 Folia 和 Paper 的分支版本。**
## 功能
- 完全**可定制**。
- 支持 [**MiniMessage**](https://docs.advntr.dev/minimessage/format.html)。
- 兼容**任何 SQL 数据库**。
- **区分大小写**的昵称支持。
- 玩家**冻结**功能。
- PlaceholderAPI (**PAPI**) 支持。
- **轻量级**:对**主线程**的影响最小。
- **多服务器**支持:利用**SQL 事务**。
- **安全**:代码通过**自动化测试**得到广泛覆盖。
## 指令和权限
| 指令 | 权限 |
|--------------------------------------------------------|-------------------------|
| /whitelist add [昵称] (时间) | wlbytime.add |
| /whitelist remove [昵称] | wlbytime.remove |
| /whitelist check [昵称] | wlbytime.check |
| /whitelist checkme | wlbytime.checkme |
| /whitelist time set/add/remove [昵称] [时间] | wlbytime.time |
| /whitelist getall (页码) | wlbytime.getall |
| /whitelist freeze [昵称] [时间] | wlbytime.freeze |
| /whitelist unfreeze [昵称] | wlbytime.unfreeze|
| /whitelist reload | wlbytime.reload |
**权限可以在 `commands.yml` 配置文件中进行配置!**
### 注意事项:
- `[昵称]` - 必需参数。
- `(页码)` - 列表页码;如果未指定,默认为 1。
- `(时间)` - 玩家将被白名单的时间长度。
示例:`2d 3h 10m`。
留空以永久白名单。
## 占位符
所有输出消息都可以在配置文件中进行自定义。
- `%wlbytime_in_whitelist%` - 指示玩家是否在白名单中。
- `%wlbytime_time_left%` - 白名单中剩余的时间。
## 常见问题解答
1. **为什么插件文件大小很大?**
它包括 ORMLite (数据库)、Caffeine (缓存)、bStats (指标) 和 Elytrium-Serializer (配置处理) 等库。
2. **我遇到问题或有建议,在哪里报告?**
在这个存储库中打开一个问题,并提供详细的描述。 任何反馈都是受欢迎的!
3. **是否会支持 BungeeCord/Velocity?**
不,该插件正在专门为 Paper 和 Folia 开发。
## 配置文件
### `settings.yml`
```yaml
#玩家加入服务器时,自动取消冻结玩家时间,如果他们被冻结
unfreeze-time-on-player-join: false
#启用过期监控器,它会检查玩家的过期状态
expire-monitor-enabled: true
#过期监控器检查玩家并从数据库中删除他们的间隔(毫秒)
expire-monitor-interval-ms: 1000
#启用上次加入监控器,它会检查玩家的上次加入时间戳
last-join-monitor-enabled: false
#玩家上次加入和当前时间之间的阈值(秒)。 如果超过,玩家将被监控器删除
last-join-expiration-threshold-seconds: 2678400
#上次加入监控器检查玩家并删除他们的间隔(毫秒)
last-join-monitor-interval-ms: 3600000
#启用区分大小写的昵称检查
nickname-case-sensitive: true
#当玩家时间过期时,将其从服务器中踢出
kick-player-on-time-expire: true
#提醒玩家他们在白名单中还有多少时间。 如果玩家被永久白名单或冻结,则此功能不起作用。
notify-players-how-much-left: false
#插件向玩家发送提醒多少次的时间间隔(毫秒)
notify-player-monitor-interval-ms: 1000
#时间剩余阈值(秒)。
#如果玩家到白名单过期剩余时间少于此时间,
#插件将开始向他们发送提醒。 示例:3600 = 提醒剩余时间小于 1 小时。
notify-player-time-left-threshold-seconds: 5
#表示年份时间单位的符号
year-time-units:
- "y"
#表示月份时间单位的符号
month-time-units:
- "mo"
#表示周时间单位的符号
week-time-units:
- "w"
#表示天时间单位的符号
day-time-units:
- "d"
#表示小时时间单位的符号
hour-time-units:
- "h"
#表示分钟时间单位的符号
minute-time-units:
- "m"
#表示秒时间单位的符号
second-time-units:
- "s"
```
### `database.yml`
```yaml
#'sqlite' or 'mysql'
type: "sqlite"
#如果不是 sqlite 或 h2
address: "localhost:3030"
name: "wlbytime"
#连接参数
params:
- "autoReconnect=true"
#使用用户名和密码
use-user-and-password: false
user: "user"
password: "qwerty123"
```
### `placeholders.yml`
```yaml
placeholders-enabled: false
#%wlbytime_in_whitelist% - 在白名单中或被冻结
in-whitelist-true: "✔"
in-whitelist-false: "✖"
frozen: "❄️"
#%wlbytime_time_left% - 白名单中剩余时间
forever: "∞"
time-left: "%time%"
time-left-with-freeze: "❄️%time%❄️"
```
### `messages.yml`
```yaml
not-permission: "您没有权限!"
incorrect-arguments: "参数不正确"
you-not-in-whitelist-or-frozen-kick: "抱歉,您不在白名单中或被冻结"
player-removed-from-whitelist: "%nickname% 成功从白名单中移除"
player-already-in-whitelist: "%nickname% 已经在白名单中"
player-not-in-whitelist: "%nickname% 不在白名单中"
check-me-not-in-whitelist: "您不在白名单中"
check-me-frozen: "您被冻结了 %time%"
#针对带时间的命令
successfully-added-for-time: "%nickname% 添加到白名单,时长为 %time%"
check-still-in-whitelist-for-time: "%nickname% 仍然在白名单中,时长为 %time%"
check-me-still-in-whitelist-for-time: "您将永久保留在白名单中,时长为 %time%"
#针对不带时间的命令
successfully-added: "%nickname% 添加到白名单,永久有效"
check-still-in-whitelist: "%nickname% 永久在白名单中"
check-me-still-in-whitelist-forever: "您已永久白名单"
list-header: "> 白名单:"
list-element: "| %nickname% [%time-or-status%]"
list-empty: "白名单为空"
list-footer: "第 %page% 页 / 共 %max-page% 页 (显示另一页,请运行 /whitelist getall )"
page-not-exists: "第 %page% 页不存在,最大页码为 %max-page%"
#每页显示的记录数
entries-for-page: 10
#列表中的 '%time-or-status%'
forever: "永久"
frozen: "冻结 %time%"
active: "活跃 %time%"
expired: "过期"
set-time: "现在 %nickname% 的白名单时长为 %time%"
add-time: "为 %nickname% 添加 %time%"
remove-time: "从 %nickname% 移除 %time%"
cant-add-time-cause-player-is-forever: "无法添加时间,因为 %nickname% 是永久的"
cant-remove-time-cause-player-is-forever: "无法添加时间,因为 %nickname% 是永久的"
time-is-incorrect: "时间不正确"
cant-add-time: "无法添加时间"
cant-remove-time: "无法移除时间"
player-frozen: "玩家 %nickname% 被冻结 %time%"
player-already-frozen: "玩家 %nickname% 已经冻结"
player-expired: "玩家 %nickname% 已过期"
cant-freeze-cause-player-is-forever: "无法冻结,因为 %nickname% 是永久的"
player-unfrozen: "玩家 %nickname% 已取消冻结"
player-not-frozen: "玩家 %nickname% 未被冻结"
player-freeze-expired: "%nickname% 的冻结已过期"
plugin-successfully-reloaded: "插件已成功重新加载"
plugin-reloaded-with-errors: "插件已重新加载,但出现错误"
time-left-in-whitelist-notify: "白名单中剩余 %time%"
help:
- "> WhitelistByTime - 帮助"
- "| /whitelist add [昵称] (时间)"
- "| /whitelist remove [昵称]"
- "| /whitelist check [昵称]"
- "| /whitelist checkme"
- "| /whitelist getall"
- "| /whitelist reload"
- "| /whitelist freeze [昵称] [时间]"
- "| /whitelist time set/add/remove [昵称] [时间]"
- "| (时间) - 玩家将被添加到白名单的时间长度"
- "| 示例: 2d 3h 10m"
- "| 如果你想永久白名单,则留空此值"
```
### `commands.yml`
```yaml
#白名单子命令的权限
add-permission: "wlbytime.add"
check-permission: "wlbytime.check"
check-me-permission: "wlbytime.checkme"
freeze-permission: "wlbytime.freeze"
unfreeze-permission: "wlbytime.unfreeze"
get-all-permission: "wlbytime.getall"
remove-permission: "wlbytime.remove"
time-permission: "wlbytime.time"
reload-permission: "wlbytime.reload"
```
## 统计

*统计数据通过 bstats 指标获得。*