搜索附近方块
基本信息
| 属性 | 值 |
|---|---|
| 默认按键 | 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 收到请求后:
- 通过
SearchCooldownService.checkSearchCooldown检查冷却; - 调用
WorldUtils.getTileEntitiesAround(player, FindItConfig.SEARCH_RADIUS)取出±SearchRadius立方体内的所有 TileEntity; - 对每个 TileEntity:
- 用
tileEntity.getBlockType()与请求方块匹配(精确匹配); - 若 GregTech 已加载且 TileEntity 是
IGregTechTileEntity,则用getMetaTileID()取 meta;否则用tileEntity.getBlockMetadata(); - 与请求 meta 匹配则加入
ChunkPosition列表;
- 用
- 列表大小达到
FindItConfig.MAX_RESPONSE_SIZE时停止; - 通过
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。
相关条目
- 方块搜索服务 - 服务端/客户端 BlockFindService 实现细节
- FindItConfig - 所有可调开关与默认值
- 搜索冷却服务 - 每玩家 tick 计数器冷却