搜索冷却服务
基本信息
| 属性 | 值 |
|---|---|
| 类名 | com.gtnh.findit.service.cooldown.SearchCooldownService |
| 主类注册 | FindIt.preInit 中 new SearchCooldownService() 存入 INSTANCE.cooldownService |
| 访问入口 | FindIt.getCooldownService() |
| 消费方 | 方块搜索服务 BlockFindService.handleRequest 与 物品搜索服务 ItemFindService.handleRequest |
功能
服务端每玩家 tick 计数器限速。每次搜索请求到达服务端时调用 checkSearchCooldown(player):
long time = player.getServerForPlayer().func_73046_m().getTickCounter();
Long lastTime = lastSearchTime.get(player);
if (lastTime != null && time - lastTime < FindItConfig.SEARCH_COOLDOWN) {
return true; // 冷却中,请求被丢弃
}
lastSearchTime.put(player, time);
return false; // 允许搜索
行为细节:
- 用
WeakHashMap<EntityPlayerMP, Long>存储每个玩家最后一次成功搜索时的服务端 tick 数;玩家离线后 GC 自动回收条目。 - tick 计数通过
player.getServerForPlayer().func_73046_m().getTickCounter()取 MinecraftServer 全局 tick 计数器(即MinecraftServer#getTickCounter)。 - 比较语义是单向:仅在最近一次搜索之后
SEARCH_COOLDOWN个 tick 内的请求会被丢弃。 - 设为
FindItConfig.SEARCH_COOLDOWN = 0时,time - lastTime < 0永远为 false,等于禁用冷却。 - 调用
checkSearchCooldown后总是把当前 tick 写入 map(即使在冷却期)——即冷却期内的重复点击会延长最后冷却基准,但不会"叠加"。
数值
| 数值 | 默认 | 字段 |
|---|---|---|
| 冷却时长 | 10 tick(0.5 秒 @ 20 TPS) |
FindItConfig.SEARCH_COOLDOWN |
| 冷却范围下限 | >= 0 |
FindItConfig.@RangeInt(min = 0) |
限制
- 仅限速搜索请求本身;不影响
FindItNetwork消息的发送频率(消息本身仍可达)。 - 玩家离线后条目由 WeakHashMap 自动回收,不会泄露。
- 服务端只冷却,
ClientBlockFindService.handleResponse/ClientItemFindService.handleResponse在客户端独立运行。 - 与
MAX_RESPONSE_SIZE正交:冷却通过后仍可能命中 0 个(命中数受MAX_RESPONSE_SIZE与SEARCH_RADIUS共同约束)。
第三方 mod 集成
无第三方 mod 集成(纯服务端限速)。
相关条目
- FindItConfig -
SEARCH_COOLDOWN字段定义 - 方块搜索服务 -
BlockFindService.handleRequest第一个调用 - 物品搜索服务 -
ItemFindService.handleRequest第一个调用