搜索附近方块

基本信息

属性 值
默认按键 Y
内部 ID gui.findit.find_block
类别 nei.options.keys.gui.findit
语言条目 nei.options.keys.gui.findit.find_block = “Search For Block Nearby”(en_US)/ “搜索附近的方块”(zh_CN)
注册类 com.gtnh.findit.service.blockfinder.ClientBlockFindService 构造器
触发类 com.gtnh.findit.service.blockfinder.ClientBlockFindService.BlockFindInputHandler(继承 AbstractStackFinder)
容器监听 NEI GuiContainerManager.addInputHandler(...)

功能

按下 Y 键触发 NEI IContainerInputHandler.lastKeyTyped 钩子,悬停目标方块并向服务器发送 FindBlockRequest 消息。

服务器 BlockFindService.handleRequest 收到请求后:

  1. 通过 SearchCooldownService.checkSearchCooldown 检查冷却;
  2. 调用 WorldUtils.getTileEntitiesAround(player, FindItConfig.SEARCH_RADIUS) 取出 ±SearchRadius 立方体内的所有 TileEntity;
  3. 对每个 TileEntity:
    • 用 tileEntity.getBlockType() 与请求方块匹配(精确匹配);
    • 若 GregTech 已加载且 TileEntity 是 IGregTechTileEntity,则用 getMetaTileID() 取 meta;否则用 tileEntity.getBlockMetadata();
    • 与请求 meta 匹配则加入 ChunkPosition 列表;
  4. 列表大小达到 FindItConfig.MAX_RESPONSE_SIZE 时停止;
  5. 通过 FindItNetwork.CHANNEL.sendTo(...) 把 BlockFoundResponse(positions) 发回客户端。

触发与限制

触发条件 行为
客户端在 NEI 容器内按 Y 键悬停方块 发送 FindBlockRequest(block, meta) 给服务器;命中则客户端按 FindItConfig USE_PARTICLE_HIGHLIGHTER 选择 BlockHighlighter(红色线框)或 ParticlePosition(淡紫红粒子)
客户端命中后存在非空 positions 自动 player.closeScreen() 关闭当前 GUI
FindItConfig.ENABLE_ROTATE_VIEW 为 true 且命中 通过 ClientFinderHelperUtils.lookAtTarget(player, response) 把视角旋转到最近一个命中方块中心
服务端处于冷却期 直接返回,不发送响应
搜索半径内 Block.getBlockFromItem(stack.getItem()) == Blocks.air BlockFindInputHandler.findStack 直接返回 false(空气不可搜索)
目标方块为 Blocks.air 服务端 FindBlockRequest.Handler.onMessage 守卫忽略

高亮渲染

BlockHighlighter(默认,线框模式)

com.gtnh.findit.fx.BlockHighlighter 在 RenderWorldLastEvent 事件里对 positions 列表逐个画 AABB 描边,颜色 GL11.glColor4f(1.0f, 0.0f, 0.0f, 1.0f)(纯红 RGB=255,0,0)。

闪烁:((time / 500) & 1) == 0 时不画(一秒闪三次的开/关切换)。

时长:FindItConfig.BLOCK_HIGHLIGHTING_DURATION 秒(默认 8 秒),到期后 positions.clear()。

特殊形态:当命中方块是 BlockChest 时用 TileEntityChest 的 getChestHighlightBox(适配相邻箱子的合并碰撞箱),否则用 getBlockHighlightBox。

ParticlePosition(粒子模式)

com.gtnh.findit.fx.ParticlePosition 继承 EntityReddustFX,粒子 RGB=255,165,255(淡红紫色),particleMaxAge *= 10、motionX/Y/Z *= 0.1、particleScale *= 2.0f、noClip=true。

每个 ChunkPosition 生成的粒子数:

particleCount = positions.size() <= 10 ? 12 : max(12 - (positions.size() - 10) / 2, 2)

新一次搜索时通过 validVersion++ 让上一批粒子 setDead(),避免重叠渲染。

数值

数值 默认 来源
默认按键 Y(Keyboard.KEY_Y) ClientBlockFindService 构造器
搜索半径 16(chebyshev/立方体) FindItConfig.SEARCH_RADIUS
服务端冷却 10 tick FindItConfig.SEARCH_COOLDOWN
最大响应数 20 FindItConfig.MAX_RESPONSE_SIZE
高亮时长 8 秒 FindItConfig.BLOCK_HIGHLIGHTING_DURATION

第三方 mod 集成

  • NotEnoughItems:注册 GuiContainerManager.addInputHandler 与 API.addHashBind,依赖此 mod 提供 NEI 输入路由。
  • GregTech:服务端对 IGregTechTileEntity 用 getMetaTileID() 取 meta,以正确匹配 GregTech 元 TileEntity 的 ID 而非原始方块 meta。

相关条目