SectionTracker.java

net.minecraft.server.level.SectionTracker

信息

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

    TODO

字段/常量

内部类/嵌套类型

构造器

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

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

参数:

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

说明:

TODO

方法

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

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

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

参数:

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

说明:

TODO

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

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

参数:

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

说明:

TODO

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

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

参数:

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

说明:

TODO

protected abstract int getLevelFromSource(long to) @ L61

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

参数:

  • to: long

说明:

TODO

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

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

参数:

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

说明:

TODO

代码

public abstract class SectionTracker extends DynamicGraphMinFixedPoint {
    protected SectionTracker(int levelCount, int minQueueSize, int minMapSize) {
        super(levelCount, minQueueSize, minMapSize);
    }
 
    @Override
    protected void checkNeighborsAfterUpdate(long node, int level, boolean onlyDecrease) {
        if (!onlyDecrease || level < this.levelCount - 2) {
            for (int offsetX = -1; offsetX <= 1; offsetX++) {
                for (int offsetY = -1; offsetY <= 1; offsetY++) {
                    for (int offsetZ = -1; offsetZ <= 1; offsetZ++) {
                        long neighbor = SectionPos.offset(node, offsetX, offsetY, offsetZ);
                        if (neighbor != node) {
                            this.checkNeighbor(node, neighbor, level, onlyDecrease);
                        }
                    }
                }
            }
        }
    }
 
    @Override
    protected int getComputedLevel(long node, long knownParent, int knownLevelFromParent) {
        int computedLevel = knownLevelFromParent;
 
        for (int offsetX = -1; offsetX <= 1; offsetX++) {
            for (int offsetY = -1; offsetY <= 1; offsetY++) {
                for (int offsetZ = -1; offsetZ <= 1; offsetZ++) {
                    long neighbor = SectionPos.offset(node, offsetX, offsetY, offsetZ);
                    if (neighbor == node) {
                        neighbor = Long.MAX_VALUE;
                    }
 
                    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 this.isSource(from) ? this.getLevelFromSource(to) : fromLevel + 1;
    }
 
    protected abstract int getLevelFromSource(long to);
 
    public void update(long node, int newLevelFrom, boolean onlyDecreased) {
        this.checkEdge(Long.MAX_VALUE, node, newLevelFrom, onlyDecreased);
    }
}

引用的其他类