加入队列

加入队列

异步排队加入队列 适用于 NeoForge 1.21.1/1.21.8。通过在线程安全的队列中暂存玩家,防止大量登录时发生崩溃和 TPS 下降。以稳定速率接纳玩家。具备自定义位置界面。服务器和客户端均需安装。

处理中

JoinQueue

版本:NeoForge 1.21.1 & 1.21.8


防止因大量玩家同时加入(例如重启后或活动期间)导致的服务器崩溃和 TPS 下降。此模组在配置阶段将连接的玩家排入等待队列,防止主线程过载。

功能

  • 激活: 默认设置下队列始终激活(queue_activation_threshold = 0)。可设定一个阈值,仅在在线玩家数超过指定值时激活。同时,在服务器重启后的宽限期(默认60秒)内,或当 TPS 低于 8.0 时,队列会强制激活。
  • TPS 检测: 仅当服务器稳定(TPS ≥ 8.0)且队列未暂停时,才会释放玩家。在严重卡顿时,释放过程会自动停止。
  • 释放速率: 玩家会按定时器依次进入——默认每2秒(普通)和每1秒(VIP),可通过 ticks_between_joins / ticks_between_joins_vip 配置。
  • 手动控制: 管理员可使用 /joinqueue pause 和 /joinqueue resume 手动停止或开始登录过程,或使用 /joinqueue toggle 启用/禁用整个模组。
  • 优先级与绕过:
    • 工作人员完全绕过队列。
    • VIP 玩家被移到队列前端,并以更快的定时器释放。
  • 服务器已满处理: 当服务器达到原版玩家上限时,普通玩家会被保留在队列中(显示“服务器已满”消息),直到有空位出现,而不会在网络层被拒绝。工作人员可绕过此限制,VIP 也可在满员时加入。
  • 异步区块加载: 在玩家加入前,于后台线程加载出生点区块(半径可配置,默认3),以防止主线程冻结。hold_back_ms 安全上限(默认1500ms)确保即使区块加载缓慢,玩家也会被释放。
  • 队列界面: 向玩家显示其当前排队位置、队列总人数以及自定义(可配置)消息,包括队列暂停时的单独消息。
  • 最低等待时间与上限: 可选的 min_queue_seconds 强制每位玩家等待最短时间,max_queue_size 可限制队列容纳的玩家数量。

命令

所有命令需要权限等级2(OP)。更改会自动保存并立即生效。

命令 描述
/joinqueue status 显示总开关、释放状态、服务器就绪状态、TPS、队列大小、阈值以及工作人员/VIP 数量。
/joinqueue toggle 启用或禁用整个模组(总开关)。
/joinqueue pause 暂停队列(玩家会累积但不会被释放)。
/joinqueue resume 恢复释放玩家。
/joinqueue reload 从 config/joinqueue.json 重新加载配置。
`/joinqueue staff <add remove> `
`/joinqueue vip <add remove> `
`/joinqueue list <staff vip>`

技术细节

  • 完全在配置阶段中运行,即在玩家完全加入世界之前。
  • 使用 ConcurrentLinkedDeque 和 AtomicInteger 实现线程安全性能。
  • TPS 通过基于 nanoTime 的滚动40刻环形缓冲区进行测量。
  • 通过 Mixin 扩展服务器保活超时时间(15秒 → 2分钟),确保队列中的玩家在等待时不会被踢出。
  • 被释放但从未完成加入握手的玩家会在15秒后被移除,以免队列停滞。
  • 兼容 Arclight/混合服务器(区块预加载在那里会被安全跳过)。
  • 服务器和客户端均需要安装。