Biome Search Worker
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.chaosthedude.naturescompass.util.BiomeSearchWorker |
| 实现 | WorldWorkerManager.IWorker |
| 调度方 | WorldWorkerManager(被 ServerTickHandler.onServerTick() 每 tick 驱动) |
行为
服务器端螺旋采样器,从玩家当前位置出发,按顺时针旋转(NORTH → EAST → SOUTH → WEST)以 sampleSpace 为步长推进一层采样,命中目标群系立即停止;超过 maxDistance 或累计 maxSamples 时按未命中结束。
采样方式(伪代码):
direction = UP(首次)
nextLength = sampleSpace
length = 0
while (radius <= maxDistance && samples <= maxSamples):
if direction == NORTH: z -= sampleSpace
elif direction == EAST: x += sampleSpace
elif direction == SOUTH: z += sampleSpace
elif direction == WEST: x -= sampleSpace
biomeAtPos = world.getBiomeGenForCoordsBody(x, z)
availableBiomes.add(biomeAtPos)
if biomeAtPos == targetBiome:
finish(found=true); return
samples++; length += sampleSpace
if length >= nextLength:
if direction != UP:
nextLength += sampleSpace
direction = clockwise(direction)
else:
direction = NORTH
length = 0
if radius > 500 && radius/500 > lastRadiusThreshold:
setSearchRadius(round(radius, 500)) // 每 500 块更新一次 HUD 半径
lastRadiusThreshold = radius/500
finish(found=false)
形成机制
- 启动入口:
ItemNaturesCompass.searchForBiome()。 - 触发条件:
maxDistance > 0 && sampleSpace > 0,否则直接finish(false)。 - 结束条件:命中目标 /
radius > maxDistance/samples > maxSamples。 - worker 完成后:
finish(true)调setFound(),finish(false)调setNotFound();同时若biome == null(即仅扫描可见群系),回包PacketAvailableBiomesSet给客户端。
数值
| 数值 | 默认值 | 来源 |
|---|---|---|
| sampleSpace | 32 | ConfigHandler.sampleSpace |
| maxDistance | 10000 | ConfigHandler.maxSearchDistance |
| maxSamples | 150000 | ConfigHandler.maxSamples |
| 半径刷新粒度 | 500 | 硬编码 roundRadius(radius, 500) |
| 初始朝向 | EnumFacing.UP(每层首次进入 NORTH) |
构造函数 |
限制
- 在大距离上(500+ 块)worker 持续跑数秒,期间玩家可以潜行右键强制 INACTIVE 取消,但 worker 引用还在
worldWorkerManager队列里直到hasWork()返回 false(半径超限)。 - 在客户端/单人集成服务器里 GUI 的"只显示已发现群系"勾选状态会同步阻塞扫描(
while (worker.hasWork()) worker.doWork()),这会导致界面在勾选瞬间卡顿——源码注释明确"Extremely bad workaround"。
第三方 mod 集成
无。worker 仅调用 Minecraft 原生 World.getBiomeGenForCoordsBody()、ChunkCoordinates。
相关条目
- WorldWorkerManager - 调度器
- EnumCompassState - worker 写回的枚举
- ConfigHandler - 配置项
- PacketAvailableBiomesSet - 仅扫描时的回包