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。

相关条目