ChunkTracker.java

net.minecraft.server.level.ChunkTracker

信息

  • 全限定名:net.minecraft.server.level.ChunkTracker
  • 类型:public abstract class
  • 包:net.minecraft.server.level
  • 源码路径:src/main/java/net/minecraft/server/level/ChunkTracker.java
  • 起始行号:L6
  • 继承:DynamicGraphMinFixedPoint
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

构造器

protected ChunkTracker(int levelCount, int minQueueSize, int minMapSize) @ L7

  • 构造器名:ChunkTracker
  • 源码定位:L7
  • 修饰符:protected

参数:

  • levelCount: int
  • minQueueSize: int
  • minMapSize: int

说明:

TODO

方法

下面的方法块按源码顺序生成。

protected boolean isSource(long node) @ L11

  • 方法名:isSource
  • 源码定位:L11
  • 返回类型:boolean
  • 修饰符:protected

参数:

  • node: long

说明:

TODO

protected void checkNeighborsAfterUpdate(long node, int level, boolean onlyDecrease) @ L16

  • 方法名:checkNeighborsAfterUpdate
  • 源码定位:L16
  • 返回类型:void
  • 修饰符:protected

参数:

  • node: long
  • level: int
  • onlyDecrease: boolean

说明:

TODO

protected int getComputedLevel(long node, long knownParent, int knownLevelFromParent) @ L34

  • 方法名:getComputedLevel
  • 源码定位:L34
  • 返回类型:int
  • 修饰符:protected

参数:

  • node: long
  • knownParent: long
  • knownLevelFromParent: int

说明:

TODO

protected int computeLevelFromNeighbor(long from, long to, int fromLevel) @ L64

  • 方法名:computeLevelFromNeighbor
  • 源码定位:L64
  • 返回类型:int
  • 修饰符:protected

参数:

  • from: long
  • to: long
  • fromLevel: int

说明:

TODO

protected abstract int getLevelFromSource(long to) @ L69

  • 方法名:getLevelFromSource
  • 源码定位:L69
  • 返回类型:int
  • 修饰符:protected abstract

参数:

  • to: long

说明:

TODO

public void update(long node, int newLevelFrom, boolean onlyDecreased) @ L71

  • 方法名:update
  • 源码定位:L71
  • 返回类型:void
  • 修饰符:public

参数:

  • node: long
  • newLevelFrom: int
  • onlyDecreased: boolean

说明:

TODO

代码

public abstract class ChunkTracker extends DynamicGraphMinFixedPoint {
    protected ChunkTracker(int levelCount, int minQueueSize, int minMapSize) {
        super(levelCount, minQueueSize, minMapSize);
    }
 
    @Override
    protected boolean isSource(long node) {
        return node == ChunkPos.INVALID_CHUNK_POS;
    }
 
    @Override
    protected void checkNeighborsAfterUpdate(long node, int level, boolean onlyDecrease) {
        if (!onlyDecrease || level < this.levelCount - 2) {
            ChunkPos pos = ChunkPos.unpack(node);
            int x = pos.x();
            int z = pos.z();
 
            for (int offsetX = -1; offsetX <= 1; offsetX++) {
                for (int offsetZ = -1; offsetZ <= 1; offsetZ++) {
                    long neighbor = ChunkPos.pack(x + offsetX, z + offsetZ);
                    if (neighbor != node) {
                        this.checkNeighbor(node, neighbor, level, onlyDecrease);
                    }
                }
            }
        }
    }
 
    @Override
    protected int getComputedLevel(long node, long knownParent, int knownLevelFromParent) {
        int computedLevel = knownLevelFromParent;
        ChunkPos pos = ChunkPos.unpack(node);
        int x = pos.x();
        int z = pos.z();
 
        for (int offsetX = -1; offsetX <= 1; offsetX++) {
            for (int offsetZ = -1; offsetZ <= 1; offsetZ++) {
                long neighbor = ChunkPos.pack(x + offsetX, z + offsetZ);
                if (neighbor == node) {
                    neighbor = ChunkPos.INVALID_CHUNK_POS;
                }
 
                if (neighbor != knownParent) {
                    int costFromNeighbor = this.computeLevelFromNeighbor(neighbor, node, this.getLevel(neighbor));
                    if (computedLevel > costFromNeighbor) {
                        computedLevel = costFromNeighbor;
                    }
 
                    if (computedLevel == 0) {
                        return computedLevel;
                    }
                }
            }
        }
 
        return computedLevel;
    }
 
    @Override
    protected int computeLevelFromNeighbor(long from, long to, int fromLevel) {
        return from == ChunkPos.INVALID_CHUNK_POS ? this.getLevelFromSource(to) : fromLevel + 1;
    }
 
    protected abstract int getLevelFromSource(long to);
 
    public void update(long node, int newLevelFrom, boolean onlyDecreased) {
        this.checkEdge(ChunkPos.INVALID_CHUNK_POS, node, newLevelFrom, onlyDecreased);
    }
}

引用的其他类