搜索冷却服务

基本信息

属性 值
类名 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;      // 允许搜索

行为细节:

  1. 用 WeakHashMap<EntityPlayerMP, Long> 存储每个玩家最后一次成功搜索时的服务端 tick 数;玩家离线后 GC 自动回收条目。
  2. tick 计数通过 player.getServerForPlayer().func_73046_m().getTickCounter() 取 MinecraftServer 全局 tick 计数器(即 MinecraftServer#getTickCounter)。
  3. 比较语义是单向:仅在最近一次搜索之后 SEARCH_COOLDOWN 个 tick 内的请求会被丢弃。
  4. 设为 FindItConfig.SEARCH_COOLDOWN = 0 时,time - lastTime < 0 永远为 false,等于禁用冷却。
  5. 调用 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 集成(纯服务端限速)。

相关条目